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.
Netty-Inbound packet listener
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment