Guest User

PacketPipeline

a guest
Dec 26th, 2015
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.74 KB | None | 0 0
  1. package com.happykiller.weightlimit.server.packet;
  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 io.netty.buffer.ByteBuf;
  10. import io.netty.buffer.Unpooled;
  11. import io.netty.channel.ChannelHandler;
  12. import io.netty.channel.ChannelHandlerContext;
  13. import io.netty.handler.codec.MessageToMessageCodec;
  14. import net.minecraft.client.Minecraft;
  15. import net.minecraft.entity.player.EntityPlayer;
  16. import net.minecraft.entity.player.EntityPlayerMP;
  17. import net.minecraft.network.INetHandler;
  18. import net.minecraft.network.NetHandlerPlayServer;
  19. import net.minecraft.network.PacketBuffer;
  20. import net.minecraftforge.fml.common.FMLCommonHandler;
  21. import net.minecraftforge.fml.common.network.FMLEmbeddedChannel;
  22. import net.minecraftforge.fml.common.network.FMLOutboundHandler;
  23. import net.minecraftforge.fml.common.network.NetworkRegistry;
  24. import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
  25. import net.minecraftforge.fml.relauncher.Side;
  26. import net.minecraftforge.fml.relauncher.SideOnly;
  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.    
  34.     private boolean isPostInitialized = false;
  35.    
  36.     public boolean registerPacket(Class<? extends AbstractPacket> clazz) {
  37.         if(this.packets.size() > 256) {
  38.             return false;
  39.         }
  40.        
  41.         if(this.packets.contains(clazz)) {
  42.             return false;
  43.         }
  44.        
  45.         if(this.isPostInitialized) {
  46.             return false;
  47.         }
  48.        
  49.         this.packets.add(clazz);
  50.        
  51.         return true;
  52.     }
  53.    
  54.     protected void encode(ChannelHandlerContext ctx, AbstractPacket msg, List<Object> out) throws Exception {
  55.         ByteBuf buffer = Unpooled.buffer();
  56.         Class<? extends AbstractPacket> clazz = msg.getClass();
  57.        
  58.         if(!this.packets.contains(msg.getClass())) {
  59.             throw new NullPointerException("No packet registered for: " + msg.getClass().getCanonicalName());
  60.         }
  61.        
  62.         byte discriminator = (byte)this.packets.indexOf(clazz);
  63.        
  64.         buffer.writeByte(discriminator);
  65.         msg.encodeInto(ctx, buffer);
  66.         FMLProxyPacket proxyPacket = new FMLProxyPacket((PacketBuffer)buffer.copy(), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
  67.        
  68.         out.add(proxyPacket);
  69.     }
  70.  
  71.     protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out) throws Exception {
  72.         ByteBuf payload = msg.payload();
  73.         byte discriminator = payload.readByte();
  74.         Class<? extends AbstractPacket> clazz = this.packets.get(discriminator);
  75.        
  76.         if(clazz == null) {
  77.             throw new NullPointerException("No packet registered for discriminator: " + discriminator);
  78.         }
  79.        
  80.         AbstractPacket pkt = clazz.newInstance();
  81.         pkt.decodeInto(ctx, payload.slice());
  82.        
  83.         EntityPlayer player;
  84.        
  85.         switch(FMLCommonHandler.instance().getEffectiveSide()) {
  86.             case CLIENT:
  87.                 player = this.getClientPlayer();
  88.                 pkt.handleClientSide(player);
  89.                 break;
  90.             case SERVER:
  91.                 INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
  92.                 player = ((NetHandlerPlayServer)netHandler).playerEntity;
  93.                 pkt.handleServerSide(player);
  94.                 break;
  95.         }
  96.     }
  97.    
  98.     public void initialize() {
  99.         this.channels = NetworkRegistry.INSTANCE.newChannel("WLChannel", this);
  100.     }
  101.    
  102.     public void registerPackets() {
  103.         //ADD OPENGUIPACKET! CHECK EXTENDEDPROP TUTORIAL UNDER UPDATING FROM 1.6.4 to 1.7.2 > Updating the Network
  104.     }
  105.    
  106.     public void postInitialize() {
  107.         if(this.isPostInitialized) {
  108.             return;
  109.         }
  110.        
  111.         this.isPostInitialized = true;
  112.        
  113.         Collections.sort(this.packets, new Comparator<Class<? extends AbstractPacket>>() {
  114.  
  115.             public int compare(Class<? extends AbstractPacket> clazz1, Class<? extends AbstractPacket> clazz2) {
  116.                 int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());
  117.                
  118.                 if(com == 0) {
  119.                     com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
  120.                 }
  121.                
  122.                 return com;
  123.             }
  124.         });
  125.     }
  126.  
  127.     @SideOnly(Side.CLIENT)
  128.     private EntityPlayer getClientPlayer() {
  129.         return Minecraft.getMinecraft().thePlayer;
  130.     }
  131.    
  132.     public void sendToAll(AbstractPacket message) {
  133.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
  134.         this.channels.get(Side.SERVER).writeAndFlush(message);
  135.     }
  136.    
  137.     public void sendTo(AbstractPacket message, EntityPlayerMP player) {
  138.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
  139.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
  140.         this.channels.get(Side.SERVER).writeAndFlush(message);
  141.     }
  142.    
  143.     public void sendToAllAround(AbstractPacket message, NetworkRegistry.TargetPoint point) {
  144.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
  145.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point);
  146.         this.channels.get(Side.SERVER).writeAndFlush(message);
  147.     }
  148.    
  149.     public void sendToDimension(AbstractPacket message, int dimensionId) {
  150.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION);
  151.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId);
  152.         this.channels.get(Side.SERVER).writeAndFlush(message);
  153.     }
  154.    
  155.     public void sendToServer(AbstractPacket message) {
  156.         this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
  157.         this.channels.get(Side.CLIENT).writeAndFlush(message);
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment