Created
March 14, 2022 11:55
-
-
Save windopper/2f4808d797ffdcd665e546e4f77b9f9c to your computer and use it in GitHub Desktop.
Revisions
-
windopper created this gist
Mar 14, 2022 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,62 @@ import io.netty.channel.*; import net.minecraft.network.protocol.game.PacketPlayInUseEntity; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import java.lang.reflect.Field; public class PacketListener implements Listener { @EventHandler public void PlayerJoinEvent(PlayerJoinEvent event) { Player player = event.getPlayer(); injectPlayer(player); } @EventHandler public void PlayerQuitEvent(PlayerQuitEvent event) { Player player = event.getPlayer(); removePlayer(player); } private void removePlayer(Player player) { Channel channel = ((CraftPlayer) player).getHandle().b.a.k; channel.eventLoop().submit(() -> { channel.pipeline().remove(player.getName()); return null; }); } private void injectPlayer(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { @Override public void channelRead(ChannelHandlerContext ctx, Object packet) throws Exception { if(packet instanceof PacketPlayInUseEntity packetPlayInUseEntity) { int entityId = (int) getValue(packetPlayInUseEntity, "a"); Bukkit.broadcastMessage("entityId : "+entityId); } super.channelRead(ctx, packet); } }; ChannelPipeline pipeline = ((CraftPlayer) player).getHandle().b.a.k.pipeline(); pipeline.addBefore("packet_handler", player.getName(), channelDuplexHandler); } private Object getValue(Object object, String fieldName) { Object result = null; try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); result = field.get(object); field.setAccessible(false); } catch(Exception e) { e.printStackTrace(); } return result; } }