mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-11 15:57:32 +00:00
Fix the netty bug introduced by netty commit https://github.com/netty/netty/commit/29fdb160f33776c76f0b46aada48a9c9f3babcbf
that means we don't get activated until after handlerAdded is complete. In effect, our handler can't handle anything until handlerAdded has completed.
This commit is contained in:
1 parent
d71291eb57
commit
92bb77bc6b
1 file changed
+33
-2
+33
-2
@@ -22,6 +22,7 @@ package net.minecraftforge.fml.common.network.handshake;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelOutboundHandler;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.ChannelPromise;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
@@ -30,6 +31,7 @@ import io.netty.util.concurrent.Future;
|
||||
import io.netty.util.concurrent.GenericFutureListener;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.SocketAddress;
|
||||
import java.nio.channels.ClosedChannelException;
|
||||
import java.util.Collections;
|
||||
@@ -71,7 +73,7 @@ import org.apache.logging.log4j.Level;
|
||||
|
||||
// TODO build test suites to validate the behaviour of this stuff and make it less annoyingly magical
|
||||
public class NetworkDispatcher extends SimpleChannelInboundHandler<Packet<?>> implements ChannelOutboundHandler {
|
||||
private static boolean DEBUG_HANDSHAKE = Boolean.parseBoolean(System.getProperty("fml.debugNetworkHandshake", "true"));
|
||||
private static boolean DEBUG_HANDSHAKE = Boolean.parseBoolean(System.getProperty("fml.debugNetworkHandshake", "false"));
|
||||
private static enum ConnectionState {
|
||||
OPENING, AWAITING_HANDSHAKE, HANDSHAKING, HANDSHAKECOMPLETE, FINALIZING, CONNECTED;
|
||||
}
|
||||
@@ -114,6 +116,20 @@ public class NetworkDispatcher extends SimpleChannelInboundHandler<Packet<?>> im
|
||||
private Map<String,String> modList;
|
||||
private int overrideLoginDim;
|
||||
|
||||
private static final Field ordered;
|
||||
|
||||
static {
|
||||
try
|
||||
{
|
||||
ordered = Class.forName("io.netty.channel.AbstractChannelHandlerContext").getDeclaredField("ordered");
|
||||
ordered.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchFieldException | ClassNotFoundException e)
|
||||
{
|
||||
FMLLog.log(Level.FATAL, "WOW, Netty changed, ****HAXXXXX****", e);
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
public NetworkDispatcher(NetworkManager manager)
|
||||
{
|
||||
super(false);
|
||||
@@ -172,7 +188,22 @@ public class NetworkDispatcher extends SimpleChannelInboundHandler<Packet<?>> im
|
||||
{
|
||||
this.manager.channel().config().setAutoRead(false);
|
||||
// Insert ourselves into the pipeline
|
||||
this.manager.channel().pipeline().addBefore("packet_handler", "fml:packet_handler", this);
|
||||
final ChannelPipeline cp = this.manager.channel().pipeline().addBefore("packet_handler", "fml:packet_handler", this);
|
||||
// THIS IS A GHASTLY HACK TO FIX A STUPID "FEATURE" IN NETTY
|
||||
// We force the "AbstractChannelHandlerContext" order field to false - because we don't want
|
||||
// our handshake handler to "WAIT" until it's completed the "handlerAdded" method, before becoming active
|
||||
// in the pipeline
|
||||
final ChannelHandlerContext context = cp.context(this);
|
||||
try
|
||||
{
|
||||
ordered.set(context, false);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
FMLLog.log(Level.FATAL, "Wow, that reflection failed!", e);
|
||||
throw new Error(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void clientToServerHandshake()
|
||||
|
||||
Reference in new issue
Block a user