diff options
Diffstat (limited to 'src/main/java/ftbsc/bscv/system/PacketHandler.java')
-rw-r--r-- | src/main/java/ftbsc/bscv/system/PacketHandler.java | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/main/java/ftbsc/bscv/system/PacketHandler.java b/src/main/java/ftbsc/bscv/system/PacketHandler.java new file mode 100644 index 0000000..7c80db2 --- /dev/null +++ b/src/main/java/ftbsc/bscv/system/PacketHandler.java @@ -0,0 +1,69 @@ +package ftbsc.bscv.system; + +import ftbsc.bscv.Boscovicino; +import io.netty.channel.*; +import net.minecraft.network.IPacket; +import net.minecraft.network.NetworkManager; +import net.minecraftforge.client.event.ClientPlayerNetworkEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +@ChannelHandler.Sharable +public class PacketHandler extends ChannelDuplexHandler { + + public PacketHandler() { + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if(processPacket(msg, false)) + super.channelRead(ctx, msg); + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + if(processPacket(msg, true)) + super.write(ctx, msg, promise); + } + + private static boolean processPacket(Object msg, boolean outgoing) { + if(msg instanceof IPacket) { + IPacket<?> pkt = (IPacket<?>) msg; + PacketEvent event = outgoing ? new PacketEvent.Outgoing(pkt) : new PacketEvent.Incoming(pkt); + MinecraftForge.EVENT_BUS.post(event); + return !event.isCanceled(); + } else return true; + } + + @SubscribeEvent + public void registerOnLogin(ClientPlayerNetworkEvent.LoggedInEvent event) { + NetworkManager nm = event.getNetworkManager(); + if(nm != null) { + nm.channel().pipeline().addBefore("packet_handler", "bscv_handler", this); + Boscovicino.LOGGER.info("Successfully registered PacketHandler!"); + } else Boscovicino.LOGGER.error("Failed to register PacketHandler: NetworkManager was null!"); + } + + @Cancelable + public static class PacketEvent extends Event { + + public static class Outgoing extends PacketEvent { + public final IPacket<?> packet; + + public Outgoing(IPacket<?> packet) { + this.packet = packet; + } + } + + public static class Incoming extends PacketEvent { + public final IPacket<?> packet; + + public Incoming(IPacket<?> packet) { + this.packet = packet; + } + } + } +} |