Помогите Как создать пакетный армор стенд

  • Автор темы Автор темы Kurumi
  • Дата начала Дата начала
В общем, у меня вроде получилось сделать как я хотел, но у меня появилась неприятная проблема.
Итак, если я сажаю (пакетом) на игрока что-либо в качестве пассажира и отправляю этот пакет всем игрокам, тогда пассажир будет ездить на игроке и все надписи над головой будут видно, НО при этом пропадает никнейм игрока. на котором сидит пассажир
upload_2021-12-5_16-53-12.png

Такое происходит только если сажаю на игрока что-либо. Хз как это фиксить
Мейби нужно каким-то пакетом обновить никнейм игрока?
Код:
public class Nameplate {

    private WrapperPlayServerSpawnEntityLiving spawnPacket;
    private WrapperPlayServerSpawnEntityLiving spawnSlimePacket;
    private WrapperPlayServerEntityMetadata metadataPacket;
    private WrapperPlayServerEntityMetadata metadataSlimePacket;
    private WrapperPlayServerEntityDestroy destroyPacket;
    private WrapperPlayServerMount mountPacket; //slime on player
    private WrapperPlayServerMount standMounPacket; //armor stand on slime
    private Player source;


    public Nameplate(Location location, String name, Player player) {
        Random random = new Random();
        int[] ids = new int[] { random.nextInt(0X7FFFFFFF), random.nextInt(0X7FFFFFFF) };
        int entityID = ids[1];
        int slimeID = ids[0];

        this.source = player;
        this.spawnPacket = new WrapperPlayServerSpawnEntityLiving();
        this.spawnSlimePacket = new WrapperPlayServerSpawnEntityLiving();
        this.metadataPacket = new WrapperPlayServerEntityMetadata();
        this.metadataSlimePacket = new WrapperPlayServerEntityMetadata();
        this.destroyPacket = new WrapperPlayServerEntityDestroy();
        this.mountPacket = new WrapperPlayServerMount();
        this.standMounPacket = new WrapperPlayServerMount();

        spawnSlimePacket.setEntityID(slimeID);
        spawnSlimePacket.setType(EntityType.SLIME);
        spawnSlimePacket.setX(location.getX());
        spawnSlimePacket.setY(location.getY());
        spawnSlimePacket.setZ(location.getZ());

        destroyPacket.setEntityIds(new int[] {entityID, slimeID});

        spawnPacket.setEntityID(entityID);
        spawnPacket.setType(EntityType.ARMOR_STAND);
        spawnPacket.setX(location.getX());
        spawnPacket.setY(location.getY());
        spawnPacket.setZ(location.getZ());

        settingsUpMetadata(entityID, slimeID, name);

        mountPacket.setEntityID(player.getEntityId());
        mountPacket.setPassengerIds(new int[] {ids[0]});

        standMounPacket.setEntityID(ids[0]);
        standMounPacket.setPassengerIds(new int[] {ids[1]});
    }

    private void settingsUpMetadata(int entityID, int slimeId, String name) {
        metadataPacket.setEntityID(entityID);
        metadataSlimePacket.setEntityID(slimeId);

        WrappedDataWatcher dataWatcher = new WrappedDataWatcher(metadataPacket.getMetadata());
        WrappedDataWatcher slimeWatcher = new WrappedDataWatcher(metadataSlimePacket.getMetadata());

        WrappedDataWatcher.WrappedDataWatcherObject isInvisibleIndex = new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class));
        WrappedDataWatcher.WrappedDataWatcherObject customName = new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.get(String.class));
        WrappedDataWatcher.WrappedDataWatcherObject nameVisible = new WrappedDataWatcher.WrappedDataWatcherObject(3, WrappedDataWatcher.Registry.get(Boolean.class));
        WrappedDataWatcher.WrappedDataWatcherObject small = new WrappedDataWatcher.WrappedDataWatcherObject(11, WrappedDataWatcher.Registry.get(Byte.class));
        WrappedDataWatcher.WrappedDataWatcherObject size = new WrappedDataWatcher.WrappedDataWatcherObject(12, WrappedDataWatcher.Registry.get(Integer.class));

        slimeWatcher.setObject(isInvisibleIndex, (byte) 0x20);
        slimeWatcher.setObject(size, 1);
        metadataSlimePacket.setMetadata(slimeWatcher.getWatchableObjects());

        dataWatcher.setObject(isInvisibleIndex, (byte) 0x20);
        dataWatcher.setObject(customName, name);
        dataWatcher.setObject(nameVisible, true);
        dataWatcher.setObject(small, (byte) (0x01 | 0x10 | 0x08));
        metadataPacket.setMetadata(dataWatcher.getWatchableObjects());
    }

    private void sendSpawn(Player player) {
        spawnPacket.sendPacket(player);
        spawnSlimePacket.sendPacket(player);

        metadataSlimePacket.sendPacket(player);
        metadataPacket.sendPacket(player);

        mountPacket.sendPacket(player);

        standMounPacket.sendPacket(player);
    }

    public void updatePackets() {
        for(Player player : Bukkit.getOnlinePlayers()) {
            if(!player.getUniqueId().equals(source.getUniqueId()))
                sendSpawn(player);
        }
    }

    public void destroyPackets() {
        for (Player player : Bukkit.getOnlinePlayers())
            if (!player.getUniqueId().equals(source.getUniqueId()))
                sendDestroyPacket(player);
    }

    private void sendDestroyPacket(Player player) {
        destroyPacket.sendPacket(player);
    }
}
 
В общем, у меня вроде получилось сделать как я хотел, но у меня появилась неприятная проблема.
Итак, если я сажаю (пакетом) на игрока что-либо в качестве пассажира и отправляю этот пакет всем игрокам, тогда пассажир будет ездить на игроке и все надписи над головой будут видно, НО при этом пропадает никнейм игрока. на котором сидит пассажир
Посмотреть вложение 61113

Такое происходит только если сажаю на игрока что-либо. Хз как это фиксить
Мейби нужно каким-то пакетом обновить никнейм игрока?
Код:
public class Nameplate {

    private WrapperPlayServerSpawnEntityLiving spawnPacket;
    private WrapperPlayServerSpawnEntityLiving spawnSlimePacket;
    private WrapperPlayServerEntityMetadata metadataPacket;
    private WrapperPlayServerEntityMetadata metadataSlimePacket;
    private WrapperPlayServerEntityDestroy destroyPacket;
    private WrapperPlayServerMount mountPacket; //slime on player
    private WrapperPlayServerMount standMounPacket; //armor stand on slime
    private Player source;


    public Nameplate(Location location, String name, Player player) {
        Random random = new Random();
        int[] ids = new int[] { random.nextInt(0X7FFFFFFF), random.nextInt(0X7FFFFFFF) };
        int entityID = ids[1];
        int slimeID = ids[0];

        this.source = player;
        this.spawnPacket = new WrapperPlayServerSpawnEntityLiving();
        this.spawnSlimePacket = new WrapperPlayServerSpawnEntityLiving();
        this.metadataPacket = new WrapperPlayServerEntityMetadata();
        this.metadataSlimePacket = new WrapperPlayServerEntityMetadata();
        this.destroyPacket = new WrapperPlayServerEntityDestroy();
        this.mountPacket = new WrapperPlayServerMount();
        this.standMounPacket = new WrapperPlayServerMount();

        spawnSlimePacket.setEntityID(slimeID);
        spawnSlimePacket.setType(EntityType.SLIME);
        spawnSlimePacket.setX(location.getX());
        spawnSlimePacket.setY(location.getY());
        spawnSlimePacket.setZ(location.getZ());

        destroyPacket.setEntityIds(new int[] {entityID, slimeID});

        spawnPacket.setEntityID(entityID);
        spawnPacket.setType(EntityType.ARMOR_STAND);
        spawnPacket.setX(location.getX());
        spawnPacket.setY(location.getY());
        spawnPacket.setZ(location.getZ());

        settingsUpMetadata(entityID, slimeID, name);

        mountPacket.setEntityID(player.getEntityId());
        mountPacket.setPassengerIds(new int[] {ids[0]});

        standMounPacket.setEntityID(ids[0]);
        standMounPacket.setPassengerIds(new int[] {ids[1]});
    }

    private void settingsUpMetadata(int entityID, int slimeId, String name) {
        metadataPacket.setEntityID(entityID);
        metadataSlimePacket.setEntityID(slimeId);

        WrappedDataWatcher dataWatcher = new WrappedDataWatcher(metadataPacket.getMetadata());
        WrappedDataWatcher slimeWatcher = new WrappedDataWatcher(metadataSlimePacket.getMetadata());

        WrappedDataWatcher.WrappedDataWatcherObject isInvisibleIndex = new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class));
        WrappedDataWatcher.WrappedDataWatcherObject customName = new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.get(String.class));
        WrappedDataWatcher.WrappedDataWatcherObject nameVisible = new WrappedDataWatcher.WrappedDataWatcherObject(3, WrappedDataWatcher.Registry.get(Boolean.class));
        WrappedDataWatcher.WrappedDataWatcherObject small = new WrappedDataWatcher.WrappedDataWatcherObject(11, WrappedDataWatcher.Registry.get(Byte.class));
        WrappedDataWatcher.WrappedDataWatcherObject size = new WrappedDataWatcher.WrappedDataWatcherObject(12, WrappedDataWatcher.Registry.get(Integer.class));

        slimeWatcher.setObject(isInvisibleIndex, (byte) 0x20);
        slimeWatcher.setObject(size, 1);
        metadataSlimePacket.setMetadata(slimeWatcher.getWatchableObjects());

        dataWatcher.setObject(isInvisibleIndex, (byte) 0x20);
        dataWatcher.setObject(customName, name);
        dataWatcher.setObject(nameVisible, true);
        dataWatcher.setObject(small, (byte) (0x01 | 0x10 | 0x08));
        metadataPacket.setMetadata(dataWatcher.getWatchableObjects());
    }

    private void sendSpawn(Player player) {
        spawnPacket.sendPacket(player);
        spawnSlimePacket.sendPacket(player);

        metadataSlimePacket.sendPacket(player);
        metadataPacket.sendPacket(player);

        mountPacket.sendPacket(player);

        standMounPacket.sendPacket(player);
    }

    public void updatePackets() {
        for(Player player : Bukkit.getOnlinePlayers()) {
            if(!player.getUniqueId().equals(source.getUniqueId()))
                sendSpawn(player);
        }
    }

    public void destroyPackets() {
        for (Player player : Bukkit.getOnlinePlayers())
            if (!player.getUniqueId().equals(source.getUniqueId()))
                sendDestroyPacket(player);
    }

    private void sendDestroyPacket(Player player) {
        destroyPacket.sendPacket(player);
    }
}
Ну посади сверху еще стенд с никнеймом, проблем?
 
Ну посади сверху еще стенд с никнеймом, проблем?
Так костыль же
Думаю мб я чет не так делаю и можно сделать нормально
Но если способов больше нет, видимо придется костылить
 
Назад
Верх