From 80724a52d3db7734721d36503518936e2d6ad16a Mon Sep 17 00:00:00 2001 From: Ben Staddon Date: Wed, 27 Jun 2018 20:56:46 +0100 Subject: [PATCH] Fix some ClassCastExceptions incorrectly being logged in FML handshake. (#4972) --- .../handshake/FMLHandshakeClientState.java | 27 +++++++++---------- .../handshake/HandshakeMessageHandler.java | 7 +++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java index 3e697a344..346c8ab63 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java @@ -129,7 +129,7 @@ enum FMLHandshakeClientState implements IHandshakeState WAITINGSERVERCOMPLETE { @Override - public void accept(final ChannelHandlerContext ctx, final FMLHandshakeMessage msg, final Consumer cons) + public void accept(ChannelHandlerContext ctx, FMLHandshakeMessage msg, Consumer cons) { FMLHandshakeMessage.RegistryData pkt = (FMLHandshakeMessage.RegistryData)msg; Map snap = ctx.channel().attr(NetworkDispatcher.FML_GAMEDATA_SNAPSHOT).get(); @@ -156,21 +156,18 @@ enum FMLHandshakeClientState implements IHandshakeState //Do the remapping on the Client's thread in case things are reset while the client is running. We stall the network thread until this is finished which can cause the IO thread to time out... Not sure if we can do anything about that. final Map snap_f = snap; - Futures.getUnchecked(Minecraft.getMinecraft().addScheduledTask(() -> + Multimap locallyMissing = Futures.getUnchecked(Minecraft.getMinecraft().addScheduledTask(() -> GameData.injectSnapshot(snap_f, false, false))); + if (!locallyMissing.isEmpty()) { - Multimap locallyMissing = GameData.injectSnapshot(snap_f, false, false); - if (!locallyMissing.isEmpty()) - { - cons.accept(ERROR); - NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).get(); - dispatcher.rejectHandshake("Fatally missing registry entries"); - FMLLog.log.fatal("Failed to connect to server: there are {} missing registry items", locallyMissing.size()); - locallyMissing.asMap().forEach((key, value) -> FMLLog.log.debug("Missing {} Entries: {}", key, value)); - return; - } - cons.accept(PENDINGCOMPLETE); - ctx.writeAndFlush(new FMLHandshakeMessage.HandshakeAck(ordinal())).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); - })); + cons.accept(ERROR); + NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).get(); + dispatcher.rejectHandshake("Fatally missing registry entries"); + FMLLog.log.fatal("Failed to connect to server: there are {} missing registry items", locallyMissing.size()); + locallyMissing.asMap().forEach((key, value) -> FMLLog.log.debug("Missing {} Entries: {}", key, value)); + return; + } + cons.accept(PENDINGCOMPLETE); + ctx.writeAndFlush(new FMLHandshakeMessage.HandshakeAck(ordinal())).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); } }, PENDINGCOMPLETE diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/HandshakeMessageHandler.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/HandshakeMessageHandler.java index 5d547bd30..a7775b724 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/HandshakeMessageHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/HandshakeMessageHandler.java @@ -28,14 +28,16 @@ import io.netty.util.AttributeKey; public class HandshakeMessageHandler & IHandshakeState> extends SimpleChannelInboundHandler { private static final AttributeKey> STATE = AttributeKey.valueOf("fml:handshake-state"); private final AttributeKey fmlHandshakeState; - private S initialState; - private Class stateType; + private final S initialState; + private final S errorState; + private final Class stateType; @SuppressWarnings("unchecked") public HandshakeMessageHandler(Class stateType) { fmlHandshakeState = (AttributeKey) ((Object)STATE); initialState = Enum.valueOf(stateType, "START"); + errorState = Enum.valueOf(stateType, "ERROR"); this.stateType = stateType; } @Override @@ -71,6 +73,7 @@ public class HandshakeMessageHandler & IHandshakeState> ext public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { FMLLog.log.error("HandshakeMessageHandler exception", cause); + ctx.channel().attr(fmlHandshakeState).set(errorState); super.exceptionCaught(ctx, cause); } }