Advertisement
HalestormXV

PacketPipe

Mar 18th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.46 KB | None | 0 0
  1. package com.halestormxv.Main.handler.network;
  2.  
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.EnumMap;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8.  
  9. import com.halestormxv.Main.handler.network.packets.OpenGuiPacket;
  10. import com.halestormxv.lib.RefStrings;
  11.  
  12. import cpw.mods.fml.common.FMLCommonHandler;
  13. import cpw.mods.fml.common.network.FMLEmbeddedChannel;
  14. import cpw.mods.fml.common.network.FMLOutboundHandler;
  15. import cpw.mods.fml.common.network.NetworkRegistry;
  16. import cpw.mods.fml.common.network.internal.FMLProxyPacket;
  17. import cpw.mods.fml.relauncher.Side;
  18. import io.netty.buffer.ByteBuf;
  19. import io.netty.buffer.Unpooled;
  20. import io.netty.channel.ChannelHandler;
  21. import io.netty.channel.ChannelHandlerContext;
  22. import io.netty.handler.codec.MessageToMessageCodec;
  23. import net.minecraft.client.Minecraft;
  24. import net.minecraft.entity.player.EntityPlayer;
  25. import net.minecraft.network.INetHandler;
  26. import net.minecraft.network.NetHandlerPlayServer;
  27.  
  28. @ChannelHandler.Sharable
  29. public class PacketPipeline extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket> {
  30.  
  31.     private EnumMap<Side, FMLEmbeddedChannel> channels;
  32.     private LinkedList<Class<? extends AbstractPacket>> packets = new LinkedList<Class<? extends AbstractPacket>>();
  33.     private boolean isPostInitialized = false;
  34.  
  35.     public boolean registerPacket(Class<? extends AbstractPacket> clazz){
  36.         if(this.packets.size() > 256)
  37.         {
  38.             System.err.println("Maximum amount of packets reached!");
  39.             return false;
  40.         }
  41.  
  42.         if(this.packets.contains(clazz))
  43.         {
  44.             System.err.println("This packet has already been registered!");
  45.             return false;
  46.         }
  47.  
  48.         if(this.isPostInitialized)
  49.         {
  50.             System.err.println("Packet has been registered too late!");
  51.             return false;
  52.         }
  53.  
  54.         this.packets.add(clazz);
  55.         return true;
  56.     }
  57.  
  58.     public void initialize(){
  59.         this.channels = NetworkRegistry.INSTANCE.newChannel(RefStrings.PACKET_CHANNEL, this);
  60.         registerPackets();
  61.     }
  62.    
  63.     public void postInitialized(){
  64.         if(isPostInitialized)
  65.             return;
  66.        
  67.         isPostInitialized = true;
  68.         Collections.sort(this.packets, new Comparator<Class<? extends AbstractPacket>>(){
  69.             @Override
  70.             public int compare(Class<? extends AbstractPacket> arg0, Class<? extends AbstractPacket> arg1) {
  71.                 int com = String.CASE_INSENSITIVE_ORDER.compare(arg0.getCanonicalName(), arg1.getCanonicalName());
  72.                 if (com == 0)
  73.                     com = arg0.getCanonicalName().compareTo(arg1.getCanonicalName());
  74.                
  75.                 return com;
  76.             }
  77.            
  78.         });
  79.        
  80.     }
  81.  
  82.     public void registerPackets(){
  83.         //Register Packets
  84.         registerPacket(OpenGuiPacket.class);
  85.     }
  86.  
  87.     @Override
  88.     protected void encode(ChannelHandlerContext ctxx, AbstractPacket msg, List<Object> out) throws Exception {
  89.         ByteBuf buffer = Unpooled.buffer();
  90.  
  91.         Class<? extends AbstractPacket> clazz = msg.getClass();
  92.         if(!this.packets.contains(clazz))
  93.             throw new NullPointerException("This packet has never been registered: " + clazz.getCanonicalName());
  94.  
  95.         byte discriminator = (byte) this.packets.indexOf(clazz);
  96.         buffer.writeByte(discriminator);
  97.         msg.encodeInto(ctxx, buffer);
  98.  
  99.         FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), ctxx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
  100.         out.add(proxyPacket);
  101.     }
  102.  
  103.     @SuppressWarnings("null")
  104.     @Override
  105.     protected void decode(ChannelHandlerContext ctxx, FMLProxyPacket msg, List<Object> out) throws Exception {
  106.         ByteBuf payload = msg.payload();
  107.         byte discriminator = payload.readByte();
  108.  
  109.         Class<? extends AbstractPacket> clazz = this.packets.get(discriminator);
  110.         if(clazz == null)
  111.             throw new NullPointerException("This packet has never been registered: " + clazz.getCanonicalName());
  112.         AbstractPacket abstractPacket = clazz.newInstance();
  113.         abstractPacket.decodeInto(ctxx, payload.slice());
  114.  
  115.         EntityPlayer player;
  116.         switch(FMLCommonHandler.instance().getEffectiveSide()){
  117.         case CLIENT:
  118.             player = Minecraft.getMinecraft().thePlayer;
  119.             abstractPacket.handleClientSide(player);
  120.             break;
  121.         case SERVER:
  122.             INetHandler iNetHandler = ctxx.channel().attr(NetworkRegistry.NET_HANDLER).get();
  123.             player = ((NetHandlerPlayServer) iNetHandler).playerEntity;
  124.             abstractPacket.handleServerSide(player);
  125.             break;
  126.         default:
  127.         }
  128.        
  129.         out.add(abstractPacket);
  130.     }
  131.    
  132.     public void sendToServer(AbstractPacket message){
  133.         this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
  134.         this.channels.get(Side.CLIENT).writeAndFlush(message);
  135.     }
  136.  
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement