private PlayerHandler retrievePlayerHandler(Player player) { if (player == null) return null; Object entityPlayer = ReflectionUtils.getHandle(player); Object playerConnection = ReflectionUtils.getPrivateField(ENTITY_PLAYER_CLASS, "playerConnection", entityPlayer); Object networkManager = ReflectionUtils.getPrivateField( PLAYER_CONNECTION_CLASS, "networkManager", playerConnection); Channel channel = (Channel) ReflectionUtils.getPrivateField(NETWORK_MANAGER_CLASS, CHANNEL_FIELD, networkManager); PlayerHandler handler = new PlayerHandler(player); channel .pipeline() .addFirst(new InboundInitializer("PlayerHandler|" + player.getUniqueId().toString(), hook)); handler.setChannel(channel); return handler; }
@Override public void onPacketOut(Object packet, Player player) { GameProfile profile = (GameProfile) ReflectionUtils.getPrivateField( PACKET_CLASS, ReflectionUtils.byClass(PACKET_CLASS, GameProfile.class).getName(), packet); if (playerHandlers.containsKey(profile.getId())) playerHandlers.remove(profile.getId()); PlayerHandler handler = new PlayerHandler(player); handler.setChannel(super.channel); playerHandlers.put(profile.getId(), handler); }