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

Помогите Как я могу заменить playerConnection.networkManager.channel в новых версиях ? (1.17.1))

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

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

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

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Полная строка. Пытаюсь понять почему playerConnection.networkManager.channel; теперь щитается неправильным. Как это можно заменить?
    Полная строка
    Код:
    channel = craftPlayer.getHandle().playerConnection.networkManager.channel;
    channel = (Channel) craftPlayer.getHandle().b.a.k?
     
    Последнее редактирование: 16 янв 2022
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    С версии 1.17.1 больше не используются маппинги спигота для названий полей. Все эти playerConnection, networkManager и channel превратились в тыкву, то бишь в обфусцированные названия по типу a, b, c, d.
    Помимо этого, названия классов изменились согласно маппингам Mojang.

    Вопрос в другом - для чего тебе этот channel? Пакеты отправлять?
    Для этого существует ProtocolLib:
    ProtocolLibrary.getProtocolManager().sendServerPacket(receiver, packetHandle);
     
  3. Автор темы
    slime_j

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

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Да, отправлять пакеты
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Рекомендую использовать ProtocolLib для этих целей. Стоит на каждом сервере, быстро обновляется, берёт на себя задачу работы с НМС при работе с пакетами
     
    Последнее редактирование: 17 янв 2022
  5. Автор темы
    slime_j

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

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    можешь просто помочь заменить даную строку или преобразовать под версию 1 17 1 или показать пример?
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Смотри, как ядро отправляет на версии 1.17.1, делай так же.
    Ещё можешь использовать paperweight.
    Но смысла в этом всём нет
     
  7. Автор темы
    slime_j

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

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    я это всё делаю для NPC и у меня getValue возвращает постоянно null, вот код из этого класса
    Код:
    public class PacketReader {
        
        Channel channel;
        public static Map<UUID, Channel> channels = new HashMap<UUID, Channel>();
        
        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);
                }
            });
        }
    
        public void uninject(Player player) {
            channel = channels.get(player.getUniqueId());
            if( channel.pipeline().get("PacketInjector") != null) {
                channel.pipeline().remove("PacketInjector");
            }
        }
        
        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);
                        }
                    }
                }
            }
        }
        
        private Object getValue(Object instance, String name) {
            
            try {
                Field field = instance.getClass().getDeclaredField(name);
                field.setAccessible(true);
                Object result ;
                result = field.get(instance);
                
                field.setAccessible(false);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return name;
        }
    }
    
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Без понятия. Можешь отладку добавить
     
  9. mirrerror

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

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

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