Volver al índice
src/main/java/ar/com/companeros/WorkArea.java
package ar.com.companeros;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.saveddata.SavedData;
import net.minecraftforge.event.level.BlockEvent;
import net.minecraftforge.common.util.FakePlayer;
/** Guarda los bloques colocados por personas para que los bots no los recolecten. */
public final class WorkArea extends SavedData {
private final Set<Long> protectedBlocks = new HashSet<>();
private final Set<java.util.UUID> companions = new HashSet<>();
public static WorkArea get(ServerLevel level) {
return level.getDataStorage().computeIfAbsent(WorkArea::load, WorkArea::new, "companeros_zonas");
}
private static WorkArea load(CompoundTag tag) {
WorkArea data = new WorkArea();
for (long pos : tag.getLongArray("Placed")) data.protectedBlocks.add(pos);
for (var entry : tag.getList("Companions", 8)) {
try { data.companions.add(java.util.UUID.fromString(entry.getAsString())); }
catch (IllegalArgumentException ignored) { }
}
return data;
}
@Override public CompoundTag save(CompoundTag tag) {
tag.putLongArray("Placed", protectedBlocks.stream().mapToLong(Long::longValue).toArray());
var names = new net.minecraft.nbt.ListTag();
companions.forEach(id -> names.add(net.minecraft.nbt.StringTag.valueOf(id.toString())));
tag.put("Companions", names);
return tag;
}
public boolean contains(BlockPos pos) { return protectedBlocks.contains(pos.asLong()); }
public void protect(BlockPos pos) { if (protectedBlocks.add(pos.asLong())) setDirty(); }
public int companionCount() { return companions.size(); }
public void register(java.util.UUID id) { if (companions.add(id)) setDirty(); }
public void forget(java.util.UUID id) { if (companions.remove(id)) setDirty(); }
public static void recordPlacement(BlockEvent.EntityPlaceEvent event) {
if (event.getLevel() instanceof ServerLevel level && event.getEntity() instanceof Player
&& !(event.getEntity() instanceof FakePlayer)
&& !ar.com.companeros.identity.AgentRegistry.get(level.getServer()).isAgent(event.getEntity().getUUID())) {
get(level).protect(event.getPos());
if (event instanceof BlockEvent.EntityMultiPlaceEvent multi)
multi.getReplacedBlockSnapshots().forEach(snapshot -> get(level).protect(snapshot.getPos()));
}
}
}