Untitled

 avatar
unknown
java
a year ago
2.9 kB
6
Indexable
package gg.bundlegroup.screen.models;

import net.minecraft.core.component.DataComponents;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.util.ClassTreeIdRegistry;
import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Frame {

    private final int entityId;
    private final SynchedEntityData data = new SynchedEntityData.Builder(DummyEntity.INSTANCE)
            .define(ItemFrame.DATA_ITEM, ItemStack.EMPTY)
            .build();
    private final Map<Player, ServerGamePacketListenerImpl> viewers = new HashMap<>();
    private ScreenMap map;

    public Frame(int entityId) {
        this.entityId = entityId;
    }

    public void setMap(ScreenMap map) {
        if (this.map == map) {
            return;
        }

        for (Player player : viewers.keySet()) {
            this.map.removeViewer(player);
        }

        this.map = map;

        for (Player player : viewers.keySet()) {
            map.addViewer(player);
        }

        if (map != null) {
            ItemStack item = new ItemStack(Items.FILLED_MAP);
            item.set(DataComponents.MAP_ID, map.getMapId());
            data.set(ItemFrame.DATA_ITEM, item);
        } else {
            data.set(ItemFrame.DATA_ITEM, ItemStack.EMPTY);
        }

        List<SynchedEntityData.DataValue<?>> values = data.getNonDefaultValues();
        if (values != null) {
            ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, values);
            for (ServerGamePacketListenerImpl connection : viewers.values()) {
                connection.send(packet);
            }
        }
    }

    public void addViewer(Player player) {
        ServerGamePacketListenerImpl connection = ((CraftPlayer) player).getHandle().connection;
        if (viewers.put(player, connection) != null) {
            return;
        }
        if (map != null) {
            map.addViewer(player);
        }
        List<SynchedEntityData.DataValue<?>> values = data.getNonDefaultValues();
        if (values != null) {
            connection.send(new ClientboundSetEntityDataPacket(entityId, values));
        }
    }

    public void removeViewer(Player player) {
        ServerGamePacketListenerImpl connection = viewers.remove(player);
        if (connection == null) {
            return;
        }
        if (map != null) {
            map.removeViewer(player);
        }
    }

    public ScreenMap getMap() {
        return map;
    }
}
Editor is loading...
Leave a Comment