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 protectedBlocks = new HashSet<>(); private final Set 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())); } } }