Guest User

Untitled

a guest
Jul 11th, 2017
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.89 KB | None | 0 0
  1. package halestormxv.eAngelus.network;
  2.  
  3. /**
  4.  * Created by Blaze on 7/7/2017.
  5.  */
  6.  
  7. import com.google.common.base.Throwables;
  8.  
  9. import net.minecraft.client.Minecraft;
  10. import net.minecraft.entity.player.EntityPlayerMP;
  11. import net.minecraft.network.Packet;
  12. import net.minecraft.util.IThreadListener;
  13. import net.minecraftforge.fml.common.FMLCommonHandler;
  14. import net.minecraftforge.fml.common.network.NetworkRegistry;
  15. import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
  16. import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
  17. import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
  18. import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
  19. import net.minecraftforge.fml.relauncher.Side;
  20.  
  21. public class ThreadedNetworkWrapper
  22. {
  23.  
  24.     private final SimpleNetworkWrapper parent;
  25.  
  26.     public ThreadedNetworkWrapper(String channelName) {
  27.         parent = new SimpleNetworkWrapper(channelName);
  28.     }
  29.  
  30.     private final class Wrapper<REQ extends IMessage, REPLY extends IMessage> implements IMessageHandler<REQ, REPLY> {
  31.  
  32.         private final IMessageHandler<REQ, REPLY> wrapped;
  33.  
  34.         public Wrapper(IMessageHandler<REQ, REPLY> wrapped) {
  35.             this.wrapped = wrapped;
  36.         }
  37.  
  38.         @Override
  39.         public REPLY onMessage(final REQ message, final MessageContext ctx) {
  40.             final IThreadListener target = ctx.side == Side.CLIENT ? Minecraft.getMinecraft() : FMLCommonHandler.instance().getMinecraftServerInstance();
  41.             if (target != null) {
  42.                 target.addScheduledTask(new Runner(message, ctx));
  43.             }
  44.             return null;
  45.         }
  46.  
  47.         @Override
  48.         public String toString() {
  49.             return wrapped.toString();
  50.         }
  51.  
  52.         @Override
  53.         public int hashCode() {
  54.             return wrapped.hashCode();
  55.         }
  56.  
  57.         @Override
  58.         public boolean equals(Object obj) {
  59.             if (obj instanceof Wrapper) {
  60.                 return this.wrapped.equals(((Wrapper<?, ?>) obj).wrapped);
  61.             } else {
  62.                 return this.wrapped.equals(obj);
  63.             }
  64.         }
  65.  
  66.         private final class Runner implements Runnable {
  67.             private final REQ message;
  68.             private final MessageContext ctx;
  69.  
  70.             public Runner(final REQ message, final MessageContext ctx) {
  71.                 this.message = message;
  72.                 this.ctx = ctx;
  73.             }
  74.  
  75.             @Override
  76.             public void run() {
  77.                 final REPLY reply = wrapped.onMessage(message, ctx);
  78.                 if (reply != null) {
  79.                     if (ctx.side == Side.CLIENT) {
  80.                         sendToServer(reply);
  81.                     } else {
  82.                         final EntityPlayerMP player = ctx.getServerHandler().playerEntity;
  83.                         if (player != null) {
  84.                             sendTo(reply, player);
  85.                         }
  86.                     }
  87.                 }
  88.             }
  89.  
  90.         }
  91.  
  92.     }
  93.  
  94.     public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler,
  95.                                                                                Class<REQ> requestMessageType, int discriminator, Side side) {
  96.         registerMessage(instantiate(messageHandler), requestMessageType, discriminator, side);
  97.     }
  98.  
  99.     static <REQ extends IMessage, REPLY extends IMessage> IMessageHandler<? super REQ, ? extends REPLY> instantiate(
  100.             Class<? extends IMessageHandler<? super REQ, ? extends REPLY>> handler) {
  101.         try {
  102.             return handler.newInstance();
  103.         } catch (Exception e) {
  104.             throw Throwables.propagate(e);
  105.         }
  106.     }
  107.  
  108.     @SuppressWarnings({ "unchecked", "rawtypes" })
  109.     public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(IMessageHandler<? super REQ, ? extends REPLY> messageHandler,
  110.                                                                                Class<REQ> requestMessageType, int discriminator, Side side) {
  111.         parent.registerMessage((Wrapper<REQ, REPLY>) new Wrapper(messageHandler), requestMessageType, discriminator, side);
  112.     }
  113.  
  114.     public Packet<?> getPacketFrom(IMessage message) {
  115.         return parent.getPacketFrom(message);
  116.     }
  117.  
  118.     public void sendToAll(IMessage message) {
  119.         parent.sendToAll(message);
  120.     }
  121.  
  122.     public void sendTo(IMessage message, EntityPlayerMP player) {
  123.         parent.sendTo(message, player);
  124.     }
  125.  
  126.     public void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) {
  127.         parent.sendToAllAround(message, point);
  128.     }
  129.  
  130.     public void sendToDimension(IMessage message, int dimensionId) {
  131.         parent.sendToDimension(message, dimensionId);
  132.     }
  133.  
  134.     public void sendToServer(IMessage message) {
  135.         parent.sendToServer(message);
  136.     }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment