From 2a08c11598a563b6d162b22eb0a61710122547fd Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 14 Jun 2019 14:53:23 +0200 Subject: [PATCH] [1.7.10] Fix dead lock and NPE when jumping backwards in replays The deadlock is a regression due to login phase inclusion. Not sure about the NPE, it might have always existed. --- .../com/replaymod/replay/ReplayHandler.java | 6 ++++ .../replay/mixin/MixinFMLClientHandler.java | 29 +++++++++++++++++++ .../resources/mixins.replay.replaymod.json | 2 ++ 3 files changed, 37 insertions(+) create mode 100644 src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 58b4365d..662473d5 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -642,6 +642,12 @@ public class ReplayHandler { replaySender.setAsyncMode(true); replaySender.setReplaySpeed(0); + //#if MC<10800 + //$$ while (mc.currentScreen instanceof GuiOpeningReplay) { + //$$ mc.currentScreen.handleInput(); + //$$ } + //#endif + mc.getNetworkHandler().getClientConnection() //#if MC>=11300 .tick(); diff --git a/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java b/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java new file mode 100644 index 00000000..d239e2e9 --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java @@ -0,0 +1,29 @@ +//#if MC<10800 +//$$ package com.replaymod.replay.mixin; +//$$ +//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; +//$$ import cpw.mods.fml.client.FMLClientHandler; +//$$ import net.minecraft.client.Minecraft; +//$$ import net.minecraft.client.gui.GuiScreen; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ @Mixin(value = FMLClientHandler.class, remap = false) +//$$ public class MixinFMLClientHandler { +//$$ // Usually this method is called async and can just block and wait for MC to tick the network manager +//$$ // Since we sometimes call it sync though, we need to take care of ticking ourselves. +//$$ @Inject(method = "waitForPlayClient", at = @At("HEAD"), remap = false) +//$$ private void tickNetworkManager(CallbackInfo ci) { +//$$ Minecraft mc = Minecraft.getMinecraft(); +//$$ if (!mc.isCallingFromMinecraftThread()) { +//$$ return; +//$$ } +//$$ GuiScreen gui = mc.currentScreen; +//$$ if (gui instanceof GuiOpeningReplay) { +//$$ gui.handleInput(); +//$$ } +//$$ } +//$$ } +//#endif diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 730a73be..db34d1ef 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -26,6 +26,8 @@ //$$ "MixinRenderManager", //#endif "MixinViewFrustum", + //#else + //$$ "MixinFMLClientHandler", //#endif "MixinKeyboardListener", "MixinPlayerControllerMP",