Skip to content

Instantly share code, notes, and snippets.

@windopper
Created March 14, 2022 11:55
Show Gist options
  • Save windopper/2f4808d797ffdcd665e546e4f77b9f9c to your computer and use it in GitHub Desktop.
Save windopper/2f4808d797ffdcd665e546e4f77b9f9c to your computer and use it in GitHub Desktop.

Revisions

  1. windopper created this gist Mar 14, 2022.
    62 changes: 62 additions & 0 deletions PacketListener.java
    Original 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;
    }
    }