Advertisement
Guest User

PacketHandler

a guest
Aug 13th, 2015
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.34 KB | None | 0 0
  1. package net.fusionlord.fusionutil.network;
  2.  
  3. import io.netty.buffer.ByteBuf;
  4. import io.netty.buffer.Unpooled;
  5. import io.netty.channel.ChannelHandler;
  6. import io.netty.channel.ChannelHandlerContext;
  7. import io.netty.handler.codec.MessageToMessageCodec;
  8. import net.fusionlord.fusionutil.network.packets.AbstractPacket;
  9. import net.minecraft.client.Minecraft;
  10. import net.minecraft.entity.player.EntityPlayer;
  11. import net.minecraft.entity.player.EntityPlayerMP;
  12. import net.minecraft.network.INetHandler;
  13. import net.minecraft.network.NetHandlerPlayServer;
  14. import net.minecraft.network.PacketBuffer;
  15. import net.minecraftforge.fml.common.FMLCommonHandler;
  16. import net.minecraftforge.fml.common.network.FMLEmbeddedChannel;
  17. import net.minecraftforge.fml.common.network.FMLOutboundHandler;
  18. import net.minecraftforge.fml.common.network.NetworkRegistry;
  19. import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
  20. import net.minecraftforge.fml.relauncher.Side;
  21. import net.minecraftforge.fml.relauncher.SideOnly;
  22.  
  23. import java.util.Collections;
  24. import java.util.EnumMap;
  25. import java.util.LinkedList;
  26. import java.util.List;
  27.  
  28. @ChannelHandler.Sharable
  29. public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket>
  30. {
  31.     private final String CHANNEL;
  32.     private EnumMap<Side, FMLEmbeddedChannel> channels;
  33.     private LinkedList<Class<? extends AbstractPacket>> packets = new LinkedList<>();
  34.     private boolean isPostInitialised = false;
  35.     public PacketHandler(String channel)
  36.     {
  37.         CHANNEL = channel;
  38.     }
  39.  
  40.     @SideOnly(Side.CLIENT)
  41.     private static EntityPlayer getClientPlayer()
  42.     {
  43.         return Minecraft.getMinecraft().thePlayer;
  44.     }
  45.  
  46.     public boolean registerPacket(Class<? extends AbstractPacket> clazz)
  47.     {
  48.         if (this.packets.size() > 256)
  49.         {
  50.             return false;
  51.         }
  52.         if (this.packets.contains(clazz))
  53.         {
  54.             return false;
  55.         }
  56.         if (this.isPostInitialised)
  57.         {
  58.             return false;
  59.         }
  60.         this.packets.add(clazz);
  61.         return true;
  62.     }
  63.  
  64.     @Override
  65.     protected void encode(ChannelHandlerContext channelHandlerContext, net.fusionlord.fusionutil.network.packets.AbstractPacket abstractPacket, List<Object> out) throws Exception
  66.     {
  67.         ByteBuf buffer = Unpooled.buffer();
  68.         Class<? extends net.fusionlord.fusionutil.network.packets.AbstractPacket> clazz = abstractPacket.getClass();
  69.         if (!this.packets.contains(abstractPacket.getClass()))
  70.         {
  71.             throw new NullPointerException(
  72.                                                   "No Packet Registered for: "
  73.                                                           + abstractPacket.getClass().getCanonicalName()
  74.             );
  75.         }
  76.         byte discriminator = (byte) this.packets.indexOf(clazz);
  77.         buffer.writeByte(discriminator);
  78.         abstractPacket.encodeInto(channelHandlerContext, buffer);
  79.         FMLProxyPacket proxyPacket = new FMLProxyPacket(new PacketBuffer(buffer.copy()), channelHandlerContext.channel().attr(
  80.                                                                                                                                      NetworkRegistry.FML_CHANNEL).get());
  81.         out.add(proxyPacket);
  82.     }
  83.  
  84.     @Override
  85.     protected void decode(ChannelHandlerContext channelHandlerContext, FMLProxyPacket fmlProxyPacket, List<Object> out) throws Exception
  86.     {
  87.         ByteBuf payload = fmlProxyPacket.payload();
  88.         byte discriminator = payload.readByte();
  89.         Class<? extends net.fusionlord.fusionutil.network.packets.AbstractPacket> clazz = this.packets.get(discriminator);
  90.         if (clazz == null)
  91.         {
  92.             throw new NullPointerException("No packet registered for discriminator: " + discriminator);
  93.         }
  94.  
  95.         net.fusionlord.fusionutil.network.packets.AbstractPacket packet = clazz.newInstance();
  96.         packet.decodeInto(channelHandlerContext, payload.slice());
  97.  
  98.         EntityPlayer player;
  99.         switch (FMLCommonHandler.instance().getEffectiveSide())
  100.         {
  101.             case CLIENT:
  102.                 player = PacketHandler.getClientPlayer();
  103.                 packet.handleClientSide(player);
  104.                 break;
  105.  
  106.             case SERVER:
  107.                 INetHandler netHandler = channelHandlerContext.channel().attr(NetworkRegistry.NET_HANDLER).get();
  108.                 player = ((NetHandlerPlayServer) netHandler).playerEntity;
  109.                 packet.handleServerSide(player);
  110.                 break;
  111.  
  112.             default:
  113.         }
  114.         out.add(packet);
  115.     }
  116.  
  117.     public void initialise()
  118.     {
  119.         this.channels = NetworkRegistry.INSTANCE.newChannel(CHANNEL, this);
  120.     }
  121.  
  122.     public void postInitialise()
  123.     {
  124.         if (this.isPostInitialised)
  125.         {
  126.             return;
  127.         }
  128.  
  129.         this.isPostInitialised = true;
  130.  
  131.         Collections.sort(this.packets, (clazz1, clazz2) -> {
  132.             int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());
  133.             if (com == 0)
  134.             {
  135.                 com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
  136.             }
  137.  
  138.             return com;
  139.         });
  140.     }
  141.  
  142.     public void sendToAll(AbstractPacket message)
  143.     {
  144.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
  145.         this.channels.get(Side.SERVER).writeAndFlush(message);
  146.     }
  147.  
  148.     public void sendTo(AbstractPacket message, EntityPlayerMP playerMP)
  149.     {
  150.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
  151.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(playerMP);
  152.         this.channels.get(Side.SERVER).writeAndFlush(message);
  153.     }
  154.  
  155.     public void sendToAllAround(AbstractPacket message, NetworkRegistry.TargetPoint point)
  156.     {
  157.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
  158.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point);
  159.         this.channels.get(Side.SERVER).writeAndFlush(message);
  160.     }
  161.  
  162.     public void sendToDimension(AbstractPacket message, Integer dimensionId)
  163.     {
  164.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION);
  165.         this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId);
  166.         this.channels.get(Side.SERVER).writeAndFlush(message);
  167.     }
  168.  
  169.     public void sendToServer(AbstractPacket message)
  170.     {
  171.         this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
  172.         this.channels.get(Side.CLIENT).writeAndFlush(message);
  173.     }
  174.  
  175.     public void registerPackets(Class<? extends AbstractPacket> ... classes)
  176.     {
  177.         for (Class<? extends AbstractPacket> packet : classes)
  178.         {
  179.             registerPacket(packet);
  180.         }
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement