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;
}
}