Помогите Как я могу заменить playerConnection.networkManager.channel в новых версиях ? (1.17.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?
 
Последнее редактирование:
С версии 1.17.1 больше не используются маппинги спигота для названий полей. Все эти playerConnection, networkManager и channel превратились в тыкву, то бишь в обфусцированные названия по типу a, b, c, d.
Помимо этого, названия классов изменились согласно маппингам Mojang.

Вопрос в другом - для чего тебе этот channel? Пакеты отправлять?
Для этого существует ProtocolLib:
ProtocolLibrary.getProtocolManager().sendServerPacket(receiver, packetHandle);
 
С версии 1.17.1 больше не используются маппинги спигота для названий полей. Все эти playerConnection, networkManager и channel превратились в тыкву, то бишь в обфусцированные названия по типу a, b, c, d.
Помимо этого, названия классов изменились согласно маппингам Mojang.

Вопрос в другом - для чего тебе этот channel? Пакеты отправлять?
Для этого существует ProtocolLib:
ProtocolLibrary.getProtocolManager().sendServerPacket(receiver, packetHandle);
Да, отправлять пакеты
 
Да, отправлять пакеты
Рекомендую использовать ProtocolLib для этих целей. Стоит на каждом сервере, быстро обновляется, берёт на себя задачу работы с НМС при работе с пакетами
 
Последнее редактирование:
Рекомендую использовать ProtocolLib для этих целей. Стоит на каждом сервере, быстро обновляется, берёт на себя задачу работы с НМС при работе с пакетами
можешь просто помочь заменить даную строку или преобразовать под версию 1 17 1 или показать пример?
 
можешь просто помочь заменить даную строку или преобразовать под версию 1 17 1 или показать пример?
Смотри, как ядро отправляет на версии 1.17.1, делай так же.
Ещё можешь использовать paperweight.
Но смысла в этом всём нет
 
Смотри, как ядро отправляет на версии 1.17.1, делай так же.
Ещё можешь использовать paperweight.
Но смысла в этом всём нет
я это всё делаю для 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;
    }
}
 
я это всё делаю для 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;
    }
}
Без понятия. Можешь отладку добавить
 
Назад
Верх