- Баллы
- 36
- Имя в Minecraft
- slime_j
Версия 1.17.1 spigot почему getValue() возвращает null
ему передаются данные из
а readPacket() получает данные из
player берется при заходе NPC на сервер
Код:
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);
}
});
}
Код:
PacketReader reader = new PacketReader();
reader.inject(event.getPlayer());