Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как удалить нпс через ProtocolLib api

DackZz

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
deni9078
У меня есть 2 метода для создания и удаления нпс соответственно. Проблема с удалением. Дело в том, что нпс хоть и пропадает из списка игроков, но сам визуально еще виден. Как это можно исправить? Не нашел ничего в api протоколлиба.

Код:
public void spawn(Player player) {
        PacketContainer playerInfoPacket = protocolManager.createPacket(PacketType.Play.Server.PLAYER_INFO);
        playerInfoPacket.getPlayerInfoAction().write(0, EnumWrappers.PlayerInfoAction.ADD_PLAYER);

        WrappedGameProfile profile = new WrappedGameProfile(fakePlayerUUID, fakePlayerName);
        if (skinData != null) {
            profile.getProperties().put("textures", new WrappedSignedProperty("textures", skinData[0], skinData[1]));
        }

        PlayerInfoData playerInfoData = new PlayerInfoData(profile, 1, EnumWrappers.NativeGameMode.SURVIVAL, WrappedChatComponent.fromText(fakePlayerName));
        playerInfoPacket.getPlayerInfoDataLists().write(0, Collections.singletonList(playerInfoData));

        protocolManager.sendServerPacket(player, playerInfoPacket);

        PacketContainer spawnPacket = protocolManager.createPacket(PacketType.Play.Server.NAMED_ENTITY_SPAWN);
        spawnPacket.getUUIDs().write(0, fakePlayerUUID);
        spawnPacket.getDoubles()
                .write(0, location.getX())
                .write(1, location.getY())
                .write(2, location.getZ());

        spawnPacket.getBytes()
                .write(0, (byte) (location.getYaw() * 256.0F / 360.0F))
                .write(1, (byte) (location.getPitch() * 256.0F / 360.0F));

        protocolManager.sendServerPacket(player, spawnPacket);
    }

    public void destroy() {
        for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
            PacketContainer playerInfoPacket = protocolManager.createPacket(PacketType.Play.Server.PLAYER_INFO);
            playerInfoPacket.getPlayerInfoAction().write(0, EnumWrappers.PlayerInfoAction.REMOVE_PLAYER);

            WrappedGameProfile profile = new WrappedGameProfile(fakePlayerUUID, fakePlayerName);
            PlayerInfoData playerInfoData = new PlayerInfoData(profile, 1, EnumWrappers.NativeGameMode.SURVIVAL, WrappedChatComponent.fromText(fakePlayerName));
            playerInfoPacket.getPlayerInfoDataLists().write(0, Collections.singletonList(playerInfoData));
            protocolManager.sendServerPacket(onlinePlayer, playerInfoPacket);

            PacketContainer destroyPacket = protocolManager.createPacket(PacketType.Play.Server.ENTITY_DESTROY);
            destroyPacket.getIntegerArrays().write(0, new int[]{entityId});
            protocolManager.sendServerPacket(onlinePlayer, destroyPacket);

            PacketContainer entityRemoveEffect = protocolManager.createPacket(PacketType.Play.Server.ENTITY_EFFECT);
            entityRemoveEffect.getIntegers().write(0, entityId);
            protocolManager.sendServerPacket(onlinePlayer, entityRemoveEffect);
        }
    }
 
Ну логично, тебе нужен пакет деспавна. Да и не только при удалении, но и когда игрок далеко.
 

Поделиться этой страницей

Назад
Верх