Спавн арморстенда для 1 игрока

  • Автор темы Автор темы ilya50
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

ilya50

Активный участник
Пользователь
Баллы
76
Добрый вечер, как можно заспавнить фейковый арморстенд который будет видеть только 1 игрок в течении 1 секунды(те невидимый, с ником, как голограмма)? Я знаю что это делается с помощью пакетов, но не знаю как.
 
Добрый вечер, как можно заспавнить фейковый арморстенд который будет видеть только 1 игрок в течении 1 секунды(те невидимый, с ником, как голограмма)? Я знаю что это делается с помощью пакетов, но не знаю как.
Открываешь мануал по ProtocolLib и начинаешь курить. Скуриваешь полностью и начинаешь накидывать то, что тебе нужно. Или тебе, по классике, готовый код нужен?)
 
Надеюсь это не попытка на антиауру? Ибо бот не на столько отбитый, чтоб нападать на стенд вместо игрока.
 
Надеюсь это не попытка на антиауру? Ибо бот не на столько отбитый, чтоб нападать на стенд вместо игрока.
Не, я хочу сделать отображение урона при попадании как в Apex или quake champions
 
Попытался реализовать, но что то пошло не так. Как это можно исправить ?
Сначала ты полез в нмс, пытаясь создать EntityArmorStand, но так и не заспавнил его. Затем ты подтянул враппер пакета из протоколлиба и засендил его игроку.
Если ты собираешься использовать ProtocolLib, то часть кода до "WrapperPlayServer..." вообще можно удалить.
Смысл в том, что враппер, скорее всего, не поддерживает последние версии (1.14.4, к примеру)
Ты можешь обновить его самостоятельно, глянув, как написан враппер пакета и сверившись со своей версией тут: https://wiki.vg/Protocol
(скорее всего entity type из враппера соответствует entity type хаска в 1.14.4, но это не точно)
 
Последнее редактирование:
Добрый вечер, как можно заспавнить фейковый арморстенд который будет видеть только 1 игрок в течении 1 секунды(те невидимый, с ником, как голограмма)? Я знаю что это делается с помощью пакетов, но не знаю как.
Тебе вверху дали рабочий вариант, но вот еще парочка:
1. Использовать holographic-displays.
2. Использовать https://www.spigotmc.org/resources/api-hologramapi.6766/ и https://www.spigotmc.org/resources/api-packetlistenerapi.2930/
 
В HolographicDisplays есть менеджер видимости голограмм для опеределённых игроков
 
В HolographicDisplays есть менеджер видимости голограмм для опеределённых игроков
Тебе вверху дали рабочий вариант, но вот еще парочка:
1. Использовать holographic-displays.
2. Использовать https://www.spigotmc.org/resources/api-hologramapi.6766/ и https://www.spigotmc.org/resources/api-packetlistenerapi.2930/
 
Есть следующий код:
PHP:
Random rand = new Random();
            int id = rand.nextInt(20000);
            PacketContainer container = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING) {{
                getModifier().writeDefaults();
                getIntegers().write(0, id);
                getIntegers().write(1, 1);
                getDoubles().write(0, spawnLoc.getX());
                getDoubles().write(1, spawnLoc.getY());
                getDoubles().write(2, spawnLoc.getZ());
            }};

            WrappedDataWatcher watcher = container.getDataWatcherModifier().read(0);
            watcher.setObject(0, (byte) 0x20);
            watcher.setObject(2, WrappedChatComponent.fromText("test"));
            watcher.setObject(3, true);
            watcher.setObject(5, true);
            container.getDataWatcherModifier().write(0, watcher);
Но при взаимодействии с полученным watcher он выдаёт следующую ошибку:
java.lang.IllegalArgumentException: You cannot register objects without a watcher object!
Как это можно исправить ?
 
Есть следующий код:
PHP:
Random rand = new Random();
            int id = rand.nextInt(20000);
            PacketContainer container = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING) {{
                getModifier().writeDefaults();
                getIntegers().write(0, id);
                getIntegers().write(1, 1);
                getDoubles().write(0, spawnLoc.getX());
                getDoubles().write(1, spawnLoc.getY());
                getDoubles().write(2, spawnLoc.getZ());
            }};

            WrappedDataWatcher watcher = container.getDataWatcherModifier().read(0);
            watcher.setObject(0, (byte) 0x20);
            watcher.setObject(2, WrappedChatComponent.fromText("test"));
            watcher.setObject(3, true);
            watcher.setObject(5, true);
            container.getDataWatcherModifier().write(0, watcher);
Но при взаимодействии с полученным watcher он выдаёт следующую ошибку:
java.lang.IllegalArgumentException: You cannot register objects without a watcher object!
Как это можно исправить ?
https://www.spigotmc.org/threads/pr...9-updating-code-dont-understand-error.131342/
 
Всем спасибо за помощь, вот финальный вариант если кому то понадобится.
Он спавнит ArmorStand для игрока, сам ArmorStand поднимается вверх и исчезает
PHP:
public static void spawnTextArmorStand(String message, Player player, Location spawnLoc) {
    Random rand = new Random();
    int id = rand.nextInt();
    PacketContainer container = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING) {{
        getModifier().writeDefaults();
        getIntegers().write(0, id);
        getIntegers().write(1, 1);
        getDoubles().write(0, spawnLoc.getX());
        getDoubles().write(1, spawnLoc.getY());
        getDoubles().write(2, spawnLoc.getZ());
    }};
    WrappedDataWatcher.Serializer registry = WrappedDataWatcher.Registry.get(Boolean.class);
    WrappedDataWatcher watcher = container.getDataWatcherModifier().read(0);
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 0x20);
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)),
            Optional.of(WrappedChatComponent.fromChatMessage(message)[0].getHandle()));
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, registry), true);
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(5, registry), true);
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(11, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01 + 0x08));
    container.getDataWatcherModifier().write(0, watcher);
    try {
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, container);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    PacketContainer move = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE) {{
        getModifier().writeDefaults();
        getIntegers().write(0, id);
        getIntegers().write(2, 2500);
    }};
    try {
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, move);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    Bukkit.getScheduler().runTaskLater(Quake.getPlugin(), () -> {
        PacketContainer deSpawn = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY) {{
            getModifier().writeDefaults();
            getIntegerArrays().write(0, new int[]{id});
        }};
        try {
            ProtocolLibrary.getProtocolManager().sendServerPacket(player, deSpawn);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }, 10);
}
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх