Created
March 14, 2022 11:55
-
-
Save windopper/2f4808d797ffdcd665e546e4f77b9f9c to your computer and use it in GitHub Desktop.
Netty-Inbound packet listener
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 characters
| 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