1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем ilya50, 16 сен 2019.

Статус темы:
Закрыта.
  1. Автор темы
    ilya50

    ilya50 Активный участник Пользователь

    Баллы:
    76
    Добрый вечер, как можно заспавнить фейковый арморстенд который будет видеть только 1 игрок в течении 1 секунды(те невидимый, с ником, как голограмма)? Я знаю что это делается с помощью пакетов, но не знаю как.
     
  2. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Открываешь мануал по ProtocolLib и начинаешь курить. Скуриваешь полностью и начинаешь накидывать то, что тебе нужно. Или тебе, по классике, готовый код нужен?)
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Надеюсь это не попытка на антиауру? Ибо бот не на столько отбитый, чтоб нападать на стенд вместо игрока.
     
  4. Автор темы
    ilya50

    ilya50 Активный участник Пользователь

    Баллы:
    76
    Не, я хочу сделать отображение урона при попадании как в Apex или quake champions
     
  5. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Сначала ты полез в нмс, пытаясь создать EntityArmorStand, но так и не заспавнил его. Затем ты подтянул враппер пакета из протоколлиба и засендил его игроку.
    Если ты собираешься использовать ProtocolLib, то часть кода до "WrapperPlayServer..." вообще можно удалить.
    Смысл в том, что враппер, скорее всего, не поддерживает последние версии (1.14.4, к примеру)
    Ты можешь обновить его самостоятельно, глянув, как написан враппер пакета и сверившись со своей версией тут: https://wiki.vg/Protocol
    (скорее всего entity type из враппера соответствует entity type хаска в 1.14.4, но это не точно)
     
    Последнее редактирование: 18 сен 2019
  6. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Тебе вверху дали рабочий вариант, но вот еще парочка:
    1. Использовать holographic-displays.
    2. Использовать https://www.spigotmc.org/resources/api-hologramapi.6766/ и https://www.spigotmc.org/resources/api-packetlistenerapi.2930/
     
  7. Luminate_

    Luminate_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Luminate_
    Пакеты.
     
  8. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Я бы за такое бан дал, ЗА ТУПОСТЬ!
     
  9. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    В HolographicDisplays есть менеджер видимости голограмм для опеределённых игроков
     
  10. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
     
  11. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Действительно, ничего.
     
  12. Автор темы
    ilya50

    ilya50 Активный участник Пользователь

    Баллы:
    76
    Есть следующий код:
    PHP:
    Random rand = new Random();
                
    int id rand.nextInt(20000);
                
    PacketContainer container = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING) {{
                    
    getModifier().writeDefaults();
                    
    getIntegers().write(0id);
                    
    getIntegers().write(11);
                    
    getDoubles().write(0spawnLoc.getX());
                    
    getDoubles().write(1spawnLoc.getY());
                    
    getDoubles().write(2spawnLoc.getZ());
                }};

                
    WrappedDataWatcher watcher container.getDataWatcherModifier().read(0);
                
    watcher.setObject(0, (byte0x20);
                
    watcher.setObject(2WrappedChatComponent.fromText("test"));
                
    watcher.setObject(3true);
                
    watcher.setObject(5true);
                
    container.getDataWatcherModifier().write(0watcher);
    Но при взаимодействии с полученным watcher он выдаёт следующую ошибку:
    java.lang.IllegalArgumentException: You cannot register objects without a watcher object!
    Как это можно исправить ?
     
  13. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    https://www.spigotmc.org/threads/pr...9-updating-code-dont-understand-error.131342/
     
  14. Автор темы
    ilya50

    ilya50 Активный участник Пользователь

    Баллы:
    76
    Всем спасибо за помощь, вот финальный вариант если кому то понадобится.
    Он спавнит ArmorStand для игрока, сам ArmorStand поднимается вверх и исчезает
    PHP:
    public static void spawnTextArmorStand(String messagePlayer playerLocation spawnLoc) {
        
    Random rand = new Random();
        
    int id rand.nextInt();
        
    PacketContainer container = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING) {{
            
    getModifier().writeDefaults();
            
    getIntegers().write(0id);
            
    getIntegers().write(11);
            
    getDoubles().write(0spawnLoc.getX());
            
    getDoubles().write(1spawnLoc.getY());
            
    getDoubles().write(2spawnLoc.getZ());
        }};
        
    WrappedDataWatcher.Serializer registry WrappedDataWatcher.Registry.get(Boolean.class);
        
    WrappedDataWatcher watcher container.getDataWatcherModifier().read(0);
        
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0WrappedDataWatcher.Registry.get(Byte.class)), (byte0x20);
        
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2WrappedDataWatcher.Registry.getChatComponentSerializer(true)),
                
    Optional.of(WrappedChatComponent.fromChatMessage(message)[0].getHandle()));
        
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3registry), true);
        
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(5registry), true);
        
    watcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(11WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01 0x08));
        
    container.getDataWatcherModifier().write(0watcher);
        try {
            
    ProtocolLibrary.getProtocolManager().sendServerPacket(playercontainer);
        } catch (
    InvocationTargetException e) {
            
    e.printStackTrace();
        }
        
    PacketContainer move = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE) {{
            
    getModifier().writeDefaults();
            
    getIntegers().write(0id);
            
    getIntegers().write(22500);
        }};
        try {
            
    ProtocolLibrary.getProtocolManager().sendServerPacket(playermove);
        } 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(playerdeSpawn);
            } catch (
    InvocationTargetException e) {
                
    e.printStackTrace();
            }
        }, 
    10);
    }
     
    Последнее редактирование: 21 сен 2019
Статус темы:
Закрыта.

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