Add workaround for race condition preventing us from joining SP (see MinecraftForge/MinecraftForge#3974)
This is done by preventing all calls to ChannelConfig.setAutoRead(false) during the call to FMLNetworkHandler.fmlClientHandshake (the two @Redirects in MixinNetworkDispatcher) and manually issuing the call before handleLoginSuccess returns (at which point the NetHandlerPlayClient has been set). This commit should be reverted once the issue mentioned above has been fixed.
This commit is contained in:
@@ -24,4 +24,9 @@ public abstract class MixinNetHandlerLoginClient {
|
|||||||
public void replayModRecording_initiateRecording(CallbackInfo cb) {
|
public void replayModRecording_initiateRecording(CallbackInfo cb) {
|
||||||
ReplayModRecording.instance.initiateRecording(networkManager);
|
ReplayModRecording.instance.initiateRecording(networkManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "handleLoginSuccess", at=@At("RETURN"))
|
||||||
|
public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) {
|
||||||
|
networkManager.channel().config().setAutoRead(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
package com.replaymod.recording.mixin;
|
package com.replaymod.recording.mixin;
|
||||||
|
|
||||||
import com.replaymod.recording.handler.FMLHandshakeFilter;
|
import com.replaymod.recording.handler.FMLHandshakeFilter;
|
||||||
|
import io.netty.channel.ChannelConfig;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.embedded.EmbeddedChannel;
|
import io.netty.channel.embedded.EmbeddedChannel;
|
||||||
|
import net.minecraft.network.EnumConnectionState;
|
||||||
|
import net.minecraft.network.NetworkManager;
|
||||||
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
|
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
|
||||||
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
@@ -10,6 +13,7 @@ import org.spongepowered.asm.mixin.Mixin;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(value = NetworkDispatcher.class, remap = false)
|
@Mixin(value = NetworkDispatcher.class, remap = false)
|
||||||
@@ -43,4 +47,17 @@ public abstract class MixinNetworkDispatcher {
|
|||||||
"replaymod_filter", new FMLHandshakeFilter());
|
"replaymod_filter", new FMLHandshakeFilter());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "clientListenForServerHandshake", at = @At(value = "INVOKE", remap = true, target =
|
||||||
|
"Lnet/minecraft/network/NetworkManager;setConnectionState(Lnet/minecraft/network/EnumConnectionState;)V"))
|
||||||
|
public void replayModRecording_raceConditionWorkAround1(NetworkManager self, EnumConnectionState ignored) { }
|
||||||
|
|
||||||
|
@Redirect(method = "insertIntoChannel", at = @At(value = "INVOKE", target =
|
||||||
|
"Lio/netty/channel/ChannelConfig;setAutoRead(Z)Lio/netty/channel/ChannelConfig;"))
|
||||||
|
public ChannelConfig replayModRecording_raceConditionWorkAround2(ChannelConfig self, boolean autoRead) {
|
||||||
|
if (side == Side.CLIENT) {
|
||||||
|
autoRead = false;
|
||||||
|
}
|
||||||
|
return self.setAutoRead(autoRead);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user