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()));
        }
    }
}