From b0f253538cd73b8c5f51cf14af6b5f68af99e19b Mon Sep 17 00:00:00 2001 From: johni0702 Date: Tue, 16 Jun 2015 19:33:34 +0200 Subject: [PATCH] Fix crash on exit of replay (no longer processing clicks mid-rendering) and OpenGL error warnings Remove MCTimerHandler, instead always install the ReplayTimer --- .../eu/crushedpixel/replaymod/ReplayMod.java | 2 + .../events/handlers/GuiEventHandler.java | 3 +- .../handlers/TickAndRenderListener.java | 4 - .../replaymod/registry/LightingHandler.java | 5 +- .../replaymod/replay/ReplayProcess.java | 18 ++-- .../replaymod/replay/ReplaySender.java | 5 +- .../replaymod/timer/MCTimerHandler.java | 91 ------------------- .../replaymod/timer/ReplayTimer.java | 50 ++++++++++ .../replaymod/video/ReplayTimer.java | 14 --- .../replaymod/video/VideoRenderer.java | 10 +- 10 files changed, 71 insertions(+), 131 deletions(-) delete mode 100755 src/main/java/eu/crushedpixel/replaymod/timer/MCTimerHandler.java create mode 100755 src/main/java/eu/crushedpixel/replaymod/timer/ReplayTimer.java delete mode 100755 src/main/java/eu/crushedpixel/replaymod/video/ReplayTimer.java diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index f18155a4..f8aa315b 100755 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -22,6 +22,7 @@ import eu.crushedpixel.replaymod.settings.ReplaySettings; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import eu.crushedpixel.replaymod.utils.TooltipRenderer; +import eu.crushedpixel.replaymod.timer.ReplayTimer; import eu.crushedpixel.replaymod.video.frame.*; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.GameSettings; @@ -98,6 +99,7 @@ public class ReplayMod { @EventHandler public void init(FMLInitializationEvent event) { + mc.timer = new ReplayTimer(); overlay = new GuiReplayOverlay(); FMLCommonHandler.instance().bus().register(new ConnectionEventHandler()); diff --git a/src/main/java/eu/crushedpixel/replaymod/events/handlers/GuiEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/handlers/GuiEventHandler.java index d442ab40..1294ec4c 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/handlers/GuiEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/handlers/GuiEventHandler.java @@ -13,7 +13,6 @@ import eu.crushedpixel.replaymod.registry.ReplayGuiRegistry; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayProcess; import eu.crushedpixel.replaymod.studio.VersionValidator; -import eu.crushedpixel.replaymod.timer.MCTimerHandler; import eu.crushedpixel.replaymod.utils.MouseUtils; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import net.minecraft.client.Minecraft; @@ -51,7 +50,7 @@ public class GuiEventHandler { } } else { try { - MCTimerHandler.setTimerSpeed(1); + mc.timer.timerSpeed = 1; } catch(Exception e) { e.printStackTrace(); } diff --git a/src/main/java/eu/crushedpixel/replaymod/events/handlers/TickAndRenderListener.java b/src/main/java/eu/crushedpixel/replaymod/events/handlers/TickAndRenderListener.java index e5855e9a..ba939e30 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/handlers/TickAndRenderListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/handlers/TickAndRenderListener.java @@ -56,10 +56,6 @@ public class TickAndRenderListener { if(ReplayHandler.isInPath()) ReplayProcess.unblockAndTick(false); if(ReplayHandler.isCamera()) ReplayHandler.setCameraEntity(ReplayHandler.getCameraEntity()); - if(ReplayHandler.isInReplay() && ReplayMod.replaySender.paused()) { - if(mc != null && mc.thePlayer != null) - MinecraftTicker.runMouseKeyboardTick(mc); - } if((mc.getRenderViewEntity() == mc.thePlayer || !mc.getRenderViewEntity().isEntityAlive()) && ReplayHandler.getCameraEntity() != null && !ReplayHandler.isInPath()) { ReplayHandler.spectateCamera(); diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/LightingHandler.java b/src/main/java/eu/crushedpixel/replaymod/registry/LightingHandler.java index b933bf1b..2122fa77 100644 --- a/src/main/java/eu/crushedpixel/replaymod/registry/LightingHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/registry/LightingHandler.java @@ -1,7 +1,6 @@ package eu.crushedpixel.replaymod.registry; import eu.crushedpixel.replaymod.ReplayMod; -import eu.crushedpixel.replaymod.timer.MCTimerHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.GameSettings.Options; @@ -25,8 +24,8 @@ public class LightingHandler { try { if(ReplayMod.replaySender.paused()) { - MCTimerHandler.advancePartialTicks(1); - MCTimerHandler.advanceRenderPartialTicks(1); + mc.timer.elapsedPartialTicks += 1; + mc.timer.renderPartialTicks += 1; } else { Minecraft.getMinecraft().entityRenderer.updateCameraAndRender(0); } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java index c90dfdbc..b7218524 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java @@ -11,7 +11,7 @@ import eu.crushedpixel.replaymod.interpolation.LinearTimestamp; import eu.crushedpixel.replaymod.interpolation.SplinePoint; import eu.crushedpixel.replaymod.settings.RenderOptions; import eu.crushedpixel.replaymod.timer.EnchantmentTimer; -import eu.crushedpixel.replaymod.timer.MCTimerHandler; +import eu.crushedpixel.replaymod.timer.ReplayTimer; import eu.crushedpixel.replaymod.video.VideoRenderer; import net.minecraft.client.Minecraft; @@ -109,7 +109,7 @@ public class ReplayProcess { } ReplayMod.chatMessageHandler.addLocalizedChatMessage("replaymod.chat.pathstarted", ChatMessageType.INFORMATION); - MCTimerHandler.setTimerSpeed(1f); + mc.timer.timerSpeed = 1; } else { try { isVideoRecording = true; @@ -136,7 +136,7 @@ public class ReplayProcess { ReplayMod.replaySender.stopHurrying(); - MCTimerHandler.setActiveTimer(); + ReplayTimer.get(mc).passive = false; ReplayMod.replaySender.setReplaySpeed(previousReplaySpeed); ReplayMod.replaySender.setReplaySpeed(0); } @@ -165,9 +165,9 @@ public class ReplayProcess { lastPartialTicks = 100; lastRenderPartialTicks = 100; lastTicks = 100; - MCTimerHandler.setRenderPartialTicks(100); - MCTimerHandler.setPartialTicks(100); - MCTimerHandler.setTicks(100); + mc.timer.renderPartialTicks = 100; + mc.timer.elapsedPartialTicks = 100; + mc.timer.elapsedTicks = 100; } if(justCheck) return; @@ -336,9 +336,9 @@ public class ReplayProcess { //if(curSpeed > 0) lastSpeed = curSpeed; - lastPartialTicks = MCTimerHandler.getPartialTicks(); - lastRenderPartialTicks = MCTimerHandler.getRenderTicks(); - lastTicks = MCTimerHandler.getTicks(); + lastPartialTicks = mc.timer.elapsedPartialTicks; + lastRenderPartialTicks = mc.timer.renderPartialTicks; + lastTicks = mc.timer.elapsedTicks; if(curTimestamp != null) ReplayMod.replaySender.sendPacketsTill(curTimestamp); diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index 8d97ec95..f1a8b960 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -8,7 +8,6 @@ import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.events.handlers.RecordingHandler; import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.holders.Position; -import eu.crushedpixel.replaymod.timer.MCTimerHandler; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import io.netty.channel.ChannelHandler.Sharable; @@ -422,7 +421,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { * @return {@code true} if it is paused, {@code false} otherwise */ public boolean paused() { - return MCTimerHandler.getTimerSpeed() == 0; + return mc.timer.timerSpeed == 0; } /** @@ -442,7 +441,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { */ public void setReplaySpeed(final double d) { if(d != 0) this.replaySpeed = d; - MCTimerHandler.setTimerSpeed((float) d); + mc.timer.timerSpeed = (float) d; } ///////////////////////////////////////////////////////// diff --git a/src/main/java/eu/crushedpixel/replaymod/timer/MCTimerHandler.java b/src/main/java/eu/crushedpixel/replaymod/timer/MCTimerHandler.java deleted file mode 100755 index 37711ed2..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/timer/MCTimerHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -package eu.crushedpixel.replaymod.timer; - -import eu.crushedpixel.replaymod.video.ReplayTimer; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Timer; - -public class MCTimerHandler { - - private static Minecraft mc = Minecraft.getMinecraft(); - - private static ReplayTimer rpt = new ReplayTimer(20); - private static Timer timerBefore; - - public static void setActiveTimer() { - if(timerBefore != null) { - mc.timer = timerBefore; - } - } - - public static void setPassiveTimer() { - if(!(mc.timer instanceof ReplayTimer)) { - timerBefore = mc.timer; - mc.timer = rpt; - } - } - - public static int getTicks() { - return mc.timer.elapsedTicks; - } - - public static void setTicks(int ticks) { - mc.timer.elapsedTicks = ticks; - } - - public static float getPartialTicks() { - return mc.timer.elapsedPartialTicks; - } - - public static void setPartialTicks(float ticks) { - mc.timer.elapsedPartialTicks = ticks; - } - - public static float getRenderTicks() { - return mc.timer.renderPartialTicks; - } - - public static Timer getTimer() { - return mc.timer; - } - - public static void advanceTicks(int ticks) { - mc.timer.elapsedTicks += ticks; - } - - public static void advancePartialTicks(float ticks) { - mc.timer.elapsedPartialTicks += ticks; - } - - public static void advanceRenderPartialTicks(float ticks) { - mc.timer.renderPartialTicks += ticks; - } - - public static void setRenderPartialTicks(float ticks) { - mc.timer.renderPartialTicks = ticks; - } - - public static float getTimerSpeed() { - return mc.timer.timerSpeed; - } - - public static void setTimerSpeed(float speed) { - mc.timer.timerSpeed = speed; - if(timerBefore != null) { - timerBefore.timerSpeed = speed; - } - } - - public static void updateTimer(double d) { - Timer t = mc.timer; - //d2 = MathHelper.clamp_double(d2, 0.0D, 1.0D); - t.elapsedPartialTicks = (float) ((double) t.elapsedPartialTicks + d * (double) t.timerSpeed * 20); - t.elapsedTicks = (int) t.elapsedPartialTicks; - t.elapsedPartialTicks -= (float) t.elapsedTicks; - - if(t.elapsedTicks > 10) { - t.elapsedTicks = 10; - } - - t.renderPartialTicks = t.elapsedPartialTicks; - } -} diff --git a/src/main/java/eu/crushedpixel/replaymod/timer/ReplayTimer.java b/src/main/java/eu/crushedpixel/replaymod/timer/ReplayTimer.java new file mode 100755 index 00000000..139636ea --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/timer/ReplayTimer.java @@ -0,0 +1,50 @@ +package eu.crushedpixel.replaymod.timer; + +import eu.crushedpixel.replaymod.events.handlers.MinecraftTicker; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Timer; +import org.lwjgl.LWJGLException; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class ReplayTimer extends Timer { + + public static ReplayTimer get(Minecraft mc) { + Timer timer = mc.timer; + if (!(timer instanceof ReplayTimer)) { + throw new IllegalStateException("ReplayTimer not installed"); + } + return (ReplayTimer) timer; + } + + /** + * When the timer is set to passive, it does not advance the (render) ticks on it's own. + */ + public boolean passive; + + public ReplayTimer() { + super(20); + } + + @Override + public void updateTimer() { + if (!passive) { + super.updateTimer(); + } + + if (timerSpeed == 0) { + try { + MinecraftTicker.runMouseKeyboardTick(Minecraft.getMinecraft()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/video/ReplayTimer.java b/src/main/java/eu/crushedpixel/replaymod/video/ReplayTimer.java deleted file mode 100755 index 55d2ffa5..00000000 --- a/src/main/java/eu/crushedpixel/replaymod/video/ReplayTimer.java +++ /dev/null @@ -1,14 +0,0 @@ -package eu.crushedpixel.replaymod.video; - -import net.minecraft.util.Timer; - -public class ReplayTimer extends Timer { - - public ReplayTimer(float p_i1018_1_) { - super(p_i1018_1_); - } - - @Override - public void updateTimer() { - } -} diff --git a/src/main/java/eu/crushedpixel/replaymod/video/VideoRenderer.java b/src/main/java/eu/crushedpixel/replaymod/video/VideoRenderer.java index b0cb258c..db193555 100644 --- a/src/main/java/eu/crushedpixel/replaymod/video/VideoRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/video/VideoRenderer.java @@ -16,7 +16,7 @@ import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplaySender; import eu.crushedpixel.replaymod.settings.RenderOptions; import eu.crushedpixel.replaymod.timer.EnchantmentTimer; -import eu.crushedpixel.replaymod.timer.MCTimerHandler; +import eu.crushedpixel.replaymod.timer.ReplayTimer; import eu.crushedpixel.replaymod.video.frame.FrameRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; @@ -69,7 +69,7 @@ public class VideoRenderer { public boolean renderVideo() throws IOException { setup(); - Timer timer = MCTimerHandler.getTimer(); + Timer timer = mc.timer; replaySender.sendPacketsTill(time.getPoint(0)); // Pre-tick twice, once to process all the packets @@ -111,8 +111,8 @@ public class VideoRenderer { mouseWasGrabbed = true; } Mouse.setGrabbed(false); - MCTimerHandler.setTimerSpeed(1f); - MCTimerHandler.setPassiveTimer(); + ReplayTimer.get(mc).passive = true; + mc.timer.timerSpeed = 1; fps = options.getFps(); if (options.isLinearMovement()) { @@ -169,7 +169,7 @@ public class VideoRenderer { if (mouseWasGrabbed) { Mouse.setGrabbed(true); } - MCTimerHandler.setActiveTimer(); + ReplayTimer.get(mc).passive = false; mc.displayGuiScreen(null); if (chunkLoadingRenderGlobal != null) { chunkLoadingRenderGlobal.uninstall();