Merge branch 'simple-netw-improve' of github.com:diesieben07/FML

This commit is contained in:
cpw 2014-08-31 21:50:25 -04:00
commit 1419a02d13
2 changed files with 48 additions and 15 deletions

View File

@ -1,8 +1,12 @@
package cpw.mods.fml.common.network.simpleimpl; package cpw.mods.fml.common.network.simpleimpl;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import net.minecraft.network.INetHandler; import net.minecraft.network.INetHandler;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.network.FMLOutboundHandler; import cpw.mods.fml.common.network.FMLOutboundHandler;
import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.NetworkRegistry;
@ -12,18 +16,18 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
public class SimpleChannelHandlerWrapper<REQ extends IMessage, REPLY extends IMessage> extends SimpleChannelInboundHandler<REQ> { public class SimpleChannelHandlerWrapper<REQ extends IMessage, REPLY extends IMessage> extends SimpleChannelInboundHandler<REQ> {
private IMessageHandler<REQ, REPLY> messageHandler; private final IMessageHandler<? super REQ, ? extends REPLY> messageHandler;
private Side side; private final Side side;
public SimpleChannelHandlerWrapper(Class<? extends IMessageHandler<REQ, REPLY>> handler, Side side, Class<REQ> requestType)
public SimpleChannelHandlerWrapper(Class<? extends IMessageHandler<? super REQ, ? extends REPLY>> handler, Side side, Class<REQ> requestType)
{
this(SimpleNetworkWrapper.instantiate(handler), side, requestType);
}
public SimpleChannelHandlerWrapper(IMessageHandler<? super REQ, ? extends REPLY> handler, Side side, Class<REQ> requestType)
{ {
super(requestType); super(requestType);
try messageHandler = Preconditions.checkNotNull(handler, "IMessageHandler must not be null");
{
messageHandler = handler.newInstance();
} catch (Exception e)
{
Throwables.propagate(e);
}
this.side = side; this.side = side;
} }
@Override @Override

View File

@ -1,7 +1,11 @@
package cpw.mods.fml.common.network.simpleimpl; package cpw.mods.fml.common.network.simpleimpl;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import java.util.EnumMap; import java.util.EnumMap;
import com.google.common.base.Throwables;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.INetHandler; import net.minecraft.network.INetHandler;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
@ -98,6 +102,31 @@ public class SimpleNetworkWrapper {
* @param side the side for the handler * @param side the side for the handler
*/ */
public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side) public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side)
{
registerMessage(instantiate(messageHandler), requestMessageType, discriminator, side);
}
static <REQ extends IMessage, REPLY extends IMessage> IMessageHandler<? super REQ, ? extends REPLY> instantiate(Class<? extends IMessageHandler<? super REQ, ? extends REPLY>> handler)
{
try
{
return handler.newInstance();
} catch (Exception e)
{
throw Throwables.propagate(e);
}
}
/**
* Register a message and it's associated handler. The message will have the supplied discriminator byte. The message handler will
* be registered on the supplied side (this is the side where you want the message to be processed and acted upon).
*
* @param messageHandler the message handler instance
* @param requestMessageType the message type
* @param discriminator a discriminator byte
* @param side the side for the handler
*/
public <REQ extends IMessage, REPLY extends IMessage> void registerMessage(IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Class<REQ> requestMessageType, int discriminator, Side side)
{ {
packetCodec.addDiscriminator(discriminator, requestMessageType); packetCodec.addDiscriminator(discriminator, requestMessageType);
FMLEmbeddedChannel channel = channels.get(side); FMLEmbeddedChannel channel = channels.get(side);
@ -112,19 +141,19 @@ public class SimpleNetworkWrapper {
} }
} }
private <REQ extends IMessage, REPLY extends IMessage, NH extends INetHandler> void addServerHandlerAfter(FMLEmbeddedChannel channel, String type, Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestType) private <REQ extends IMessage, REPLY extends IMessage, NH extends INetHandler> void addServerHandlerAfter(FMLEmbeddedChannel channel, String type, IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Class<REQ> requestType)
{ {
SimpleChannelHandlerWrapper<REQ, REPLY> handler = getHandlerWrapper(messageHandler, Side.SERVER, requestType); SimpleChannelHandlerWrapper<REQ, REPLY> handler = getHandlerWrapper(messageHandler, Side.SERVER, requestType);
channel.pipeline().addAfter(type, messageHandler.getName(), handler); channel.pipeline().addAfter(type, messageHandler.getClass().getName(), handler);
} }
private <REQ extends IMessage, REPLY extends IMessage, NH extends INetHandler> void addClientHandlerAfter(FMLEmbeddedChannel channel, String type, Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestType) private <REQ extends IMessage, REPLY extends IMessage, NH extends INetHandler> void addClientHandlerAfter(FMLEmbeddedChannel channel, String type, IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Class<REQ> requestType)
{ {
SimpleChannelHandlerWrapper<REQ, REPLY> handler = getHandlerWrapper(messageHandler, Side.CLIENT, requestType); SimpleChannelHandlerWrapper<REQ, REPLY> handler = getHandlerWrapper(messageHandler, Side.CLIENT, requestType);
channel.pipeline().addAfter(type, messageHandler.getName(), handler); channel.pipeline().addAfter(type, messageHandler.getClass().getName(), handler);
} }
private <REPLY extends IMessage, REQ extends IMessage> SimpleChannelHandlerWrapper<REQ, REPLY> getHandlerWrapper(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Side side, Class<REQ> requestType) private <REPLY extends IMessage, REQ extends IMessage> SimpleChannelHandlerWrapper<REQ, REPLY> getHandlerWrapper(IMessageHandler<? super REQ, ? extends REPLY> messageHandler, Side side, Class<REQ> requestType)
{ {
return new SimpleChannelHandlerWrapper<REQ, REPLY>(messageHandler, side, requestType); return new SimpleChannelHandlerWrapper<REQ, REPLY>(messageHandler, side, requestType);
} }