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

Помогите (Надо почитать немного код =) ) getValue() возвращает null

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

  1. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Версия 1.17.1 spigot почему getValue() возвращает null

    Код:
    private Object getValue(Object instance, String name) {
    
            try {
    
                Field field = instance.getClass().getDeclaredField(name);
                field.setAccessible(true);
                return field.get(instance);
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
            return null;
        }
    ему передаются данные из
    Код:
    public void readPacket(Player player, Packet<?> packet) {
            if(packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) {
                System.out.println("1" + packet);
                if(getValue(packet, "action").toString().equalsIgnoreCase("ATTACK")) {
                    return;
                }
                if(getValue(packet, "d").toString().equalsIgnoreCase("OFF_HAND")) {
                    return;
                }
                if(getValue(packet, "action").toString().equalsIgnoreCase("INTERACT_AT")) {
                    return;
                }
                int id = (int) getValue(packet, "a");
                
                if(getValue(packet, "action").toString().equalsIgnoreCase("INTERACT")) {
                    for (EntityPlayer npc : NPC.getNPCs()) {
                        if(npc.getId() == id) {
                            Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), new Runnable() {
                                @Override
                                public void run() {
                                    Bukkit.getPluginManager().callEvent(new RightClickNPC(player, npc));   
                                }
                            }, 0);
                        }
                    }
                }
            }
        }
    а readPacket() получает данные из
    Код:
    public void inject(Player player) {
            
            CraftPlayer craftPlayer = (CraftPlayer) player;
            channel = craftPlayer.getHandle().b.a.k;
            if(channel==null) return;
            channels.put(player.getUniqueId(), channel);
            
            if( channel.pipeline().get("PacketInjector") != null)
                return;
            
            channel.pipeline().addAfter("decoder", "PacketInjektor", new MessageToMessageDecoder<Packet<?>>() {
                @Override
                protected void decode(ChannelHandlerContext channel, Packet<?> packet, List<Object> arg) throws Exception {
                    arg.add(packet);
                    readPacket(player, packet);
                }
            });
        }
    player берется при заходе NPC на сервер
    Код:
    PacketReader reader = new PacketReader();
            reader.inject(event.getPlayer());
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Пакеты уже лет сто все отправляют ProtocolLib'ом.
    Ошибки есть в консоли?
     
  3. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Ты уверен, что там должно быть PacketInjektor, а не PacketInjector?
     
  4. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    нету
     
  5. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Я только учусь и иду по урокам CodedRed
     
  6. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Проблема заключается в том что в версии 1 17 убрали поля "action" и я не знаю как теперь проверить правый клик или левый делается по NPC поэтому я просто пропустил эту проверку и всё работает. Если кто-то знает как преобразовать поле "action" под 1 17 отпишите пожалуйста
     
  7. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Зайти в нужный и посмотреть новое название.
    Но если бы проблема была действительно в отсутствии полей - ты бы видел ошибки в консоли. Но, судя по твоим словам, ошибок в консоли не было
     
  8. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    мне просто выбивало ошибку getValue return null
    А null он возвращал из-за того что поля "action" не существует
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Помимо нулла ещё одна ошибка должна быть, поскольку ты выводишь стек при броске исключения. Ну, в общем, не важно. Главное, что разобрался
     
  10. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Для начала нет там никакого поля Action начиная как раз с 1.17.1. Там теперь полне в котором хранится конкретный инстанс кодека действия. О чём тебе кстати должно было быть написано в трейсе ошибки.
     

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