aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/bscv/system/PacketHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/ftbsc/bscv/system/PacketHandler.java')
-rw-r--r--src/main/java/ftbsc/bscv/system/PacketHandler.java69
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;
+ }
+ }
+ }
+}