Advertisement
Guest User

Untitled

a guest
Jul 18th, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.45 KB | None | 0 0
  1. package fr.impuuu.havenrp.packets;
  2.  
  3. import cpw.mods.fml.common.network.FMLEmbeddedChannel;
  4. import cpw.mods.fml.common.network.FMLOutboundHandler;
  5. import cpw.mods.fml.common.network.FMLOutboundHandler.OutboundTarget;
  6. import cpw.mods.fml.common.network.NetworkRegistry;
  7. import cpw.mods.fml.common.network.internal.FMLProxyPacket;
  8. import cpw.mods.fml.relauncher.Side;
  9. import cpw.mods.fml.relauncher.SideOnly;
  10. import io.netty.buffer.ByteBuf;
  11. import io.netty.buffer.Unpooled;
  12. import io.netty.channel.Channel;
  13. import io.netty.channel.ChannelHandler;
  14. import io.netty.channel.ChannelHandler.Sharable;
  15. import io.netty.channel.ChannelHandlerContext;
  16. import io.netty.handler.codec.MessageToMessageCodec;
  17. import io.netty.util.Attribute;
  18. import java.util.Collections;
  19. import java.util.Comparator;
  20. import java.util.EnumMap;
  21. import java.util.LinkedList;
  22. import java.util.List;
  23. import net.minecraft.client.Minecraft;
  24. import net.minecraft.entity.player.EntityPlayer;
  25. import net.minecraft.entity.player.EntityPlayerMP;
  26. import net.minecraft.network.INetHandler;
  27. import net.minecraft.network.NetHandlerPlayServer;
  28.  
  29. @ChannelHandler.Sharable
  30. public class PacketHelper
  31. extends MessageToMessageCodec<FMLProxyPacket, AbstractPacketHelper>
  32. {
  33. private EnumMap<Side, FMLEmbeddedChannel> channels;
  34. private LinkedList<Class<? extends AbstractPacketHelper>> packets = new LinkedList();
  35. private boolean isPostInitialised = false;
  36.  
  37. public boolean registerPacket(Class<? extends AbstractPacketHelper> clazz)
  38. {
  39. if (this.packets.size() > 256) {
  40. return false;
  41. }
  42. if (this.packets.contains(clazz)) {
  43. return false;
  44. }
  45. if (this.isPostInitialised) {
  46. return false;
  47. }
  48. this.packets.add(clazz);
  49. return true;
  50. }
  51.  
  52. protected void encode(ChannelHandlerContext ctx, AbstractPacketHelper msg, List<Object> out)
  53. throws Exception
  54. {
  55. ByteBuf buffer = Unpooled.buffer();
  56. Class<? extends AbstractPacketHelper> clazz = msg.getClass();
  57. if (!this.packets.contains(msg.getClass())) {
  58. throw new NullPointerException("No Packet Registered for: " + msg.getClass().getCanonicalName());
  59. }
  60. byte discriminator = (byte)this.packets.indexOf(clazz);
  61. buffer.writeByte(discriminator);
  62. msg.encodeInto(ctx, buffer);
  63. FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), (String)ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
  64. out.add(proxyPacket);
  65. }
  66.  
  67. protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out)
  68. throws Exception
  69. {
  70. ByteBuf payload = msg.payload();
  71. byte discriminator = payload.readByte();
  72. Class<? extends AbstractPacketHelper> clazz = (Class)this.packets.get(discriminator);
  73. if (clazz == null) {
  74. throw new NullPointerException("No packet registered for discriminator: " + discriminator);
  75. }
  76. AbstractPacketHelper pkt = (AbstractPacketHelper)clazz.newInstance();
  77. pkt.decodeInto(ctx, payload.slice());
  78. switch (cpw.mods.fml.common.FMLCommonHandler.instance().getEffectiveSide())
  79. {
  80. case CLIENT:
  81. EntityPlayer player = getClientPlayer();
  82. pkt.handleClientSide(player);
  83. break;
  84. case SERVER:
  85. INetHandler netHandler = (INetHandler)ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
  86. EntityPlayer player1 = ((NetHandlerPlayServer)netHandler).playerEntity;
  87. pkt.handleServerSide(player1);
  88. }
  89. }
  90.  
  91. public void initalise()
  92. {
  93. this.channels = NetworkRegistry.INSTANCE.newChannel("HavenRP", new ChannelHandler[] { this });
  94. registerPackets();
  95. }
  96.  
  97. public void registerPackets()
  98. {
  99. registerPacket(PacketMessage.class);
  100. }
  101.  
  102. public void postInitialise()
  103. {
  104. if (this.isPostInitialised) {
  105. return;
  106. }
  107. this.isPostInitialised = true;
  108. Collections.sort(this.packets, new Comparator()
  109. {
  110. public int compare(Class<? extends AbstractPacketHelper> clazz1, Class<? extends AbstractPacketHelper> clazz2)
  111. {
  112. int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());
  113. if (com == 0) {
  114. com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
  115. }
  116. return com;
  117. }
  118.  
  119. public int compare(Object o1, Object o2)
  120. {
  121. return 0;
  122. }
  123. });
  124. }
  125.  
  126. @SideOnly(Side.CLIENT)
  127. private EntityPlayer getClientPlayer()
  128. {
  129. return Minecraft.getMinecraft().thePlayer;
  130. }
  131.  
  132. public void sendToAll(AbstractPacketHelper message)
  133. {
  134. ((FMLEmbeddedChannel)this.channels.get(Side.SERVER)).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
  135. ((FMLEmbeddedChannel)this.channels.get(Side.SERVER)).writeAndFlush(message);
  136. }
  137.  
  138. public void sendTo(AbstractPacketHelper message, EntityPlayerMP player)
  139. {
  140. ((FMLEmbeddedChannel)this.channels.get(Side.SERVER)).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
  141. ((FMLEmbeddedChannel)this.channels.get(Side.SERVER)).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
  142. ((FMLEmbeddedChannel)this.channels.get(Side.SERVER)).writeAndFlush(message);
  143. }
  144.  
  145. public void sendToServer(AbstractPacketHelper message)
  146. {
  147. ((FMLEmbeddedChannel)this.channels.get(Side.CLIENT)).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
  148. ((FMLEmbeddedChannel)this.channels.get(Side.CLIENT)).writeAndFlush(message);
  149. }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement