aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/bscv/system/PacketHandler.java
blob: 7c80db2502edbb77377e6f806959fe599756fa2a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
         }
      }
   }
}