diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index 79618db0..53f9aaf4 100755 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -132,7 +132,7 @@ public class ReplayMod JOptionPane.showMessageDialog(null, "It seems like you didn't donate, so you can't use the Replay Mod yet."); FMLCommonHandler.instance().exitJava(0, false); } - */ + */ } private void removeTmcprFiles() { diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index 36b6e136..bac1a2b3 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -84,18 +84,18 @@ public class GuiReplayOverlay extends Gui { @SubscribeEvent public void onRenderGui(RenderGameOverlayEvent event) { if(ReplayProcess.isVideoRecording() && ReplayHandler.isInPath() && !(mc.currentScreen instanceof GuiCancelRender)) { - event.setCanceled(true); + if(event.isCancelable()) event.setCanceled(true); } } @SubscribeEvent public void renderRecordingIndicator(RenderGameOverlayEvent.Text event) { if(!ReplayHandler.isInReplay() && ReplayMod.replaySettings.showRecordingIndicator() && ConnectionEventHandler.isRecording()) { + this.drawString(mc.fontRendererObj, "RECORDING", 30, 18-(mc.fontRendererObj.FONT_HEIGHT/2), Color.WHITE.getRGB()); + mc.renderEngine.bindTexture(replay_gui); GlStateManager.resetColor(); GlStateManager.enableAlpha(); - mc.renderEngine.bindTexture(replay_gui); this.drawModalRectWithCustomSizedTexture(10, 10, 40, 21, 16, 16, 64, 64); - this.drawString(mc.fontRendererObj, "RECORDING", 30, 18-(mc.fontRendererObj.FONT_HEIGHT/2), Color.WHITE.getRGB()); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java index 327cf921..f7f4d4b7 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java @@ -87,6 +87,10 @@ public class ReplayHandler { inPath = replaying; } + public static void resetToleratedTimestamp() { + if(replaySender != null) replaySender.resetToleratedTimeStamp(); + } + public static void stopHurrying() { if(replaySender != null) replaySender.stopHurrying(); } @@ -380,9 +384,16 @@ public class ReplayHandler { ChannelPipeline pipeline = networkManager.channel().pipeline(); - try { - ReplayMod.overlay.resetUI(); - } catch(Exception e) {} + mc.addScheduledTask(new Runnable() { + @Override + public void run() { + try { + ReplayMod.overlay.resetUI(); + } catch(Exception e) { + e.printStackTrace(); + } + } + }); inReplay = true; } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java index 8ca12eb8..433ea92b 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java @@ -4,10 +4,12 @@ import java.awt.image.BufferedImage; import java.lang.reflect.Field; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiDownloadTerrain; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.ChunkRenderContainer; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.chunk.RenderChunk; +import net.minecraft.client.renderer.entity.RenderEntity; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.chat.ChatMessageRequests; import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType; @@ -57,6 +59,8 @@ public class ReplayProcess { public static void startReplayProcess(boolean record) { ReplayHandler.selectKeyframe(null); + firstTime = true; + isVideoRecording = record; lastPosition = null; motionSpline = null; @@ -64,6 +68,8 @@ public class ReplayProcess { timeLinear = null; calculated = false; requestFinish = false; + + ReplayHandler.resetToleratedTimestamp(); ChatMessageRequests.initialize(); if(ReplayHandler.getPosKeyframeCount() < 2 && ReplayHandler.getTimeKeyframeCount() < 2) { @@ -96,8 +102,6 @@ public class ReplayProcess { ChatMessageRequests.addChatMessage("Replay started!", ChatMessageType.INFORMATION); - mc.renderGlobal.loadRenderers(); - if(isVideoRecording()) { MCTimerHandler.setTimerSpeed(1f); MCTimerHandler.setPassiveTimer(); @@ -135,23 +139,50 @@ public class ReplayProcess { pathTick(isVideoRecording(), justCheck); } + private static float lastPartialTicks, lastRenderPartialTicks; + private static int lastTicks; + + private static boolean resetTimer = false; + + private static boolean firstTime = false; + private static void pathTick(boolean recording, boolean justCheck) { if(ReplayHandler.isHurrying()) { lastRealTime = System.currentTimeMillis(); return; } + + if(firstTime) { + firstTime = false; + lastPartialTicks = 100; + lastRenderPartialTicks = 100; + lastTicks = 100; + MCTimerHandler.setRenderPartialTicks(100); + MCTimerHandler.setPartialTicks(100); + MCTimerHandler.setTicks(100); + System.out.println(ReplayHandler.getReplayTime()); + } if(recording && ((ReplayMod.replaySettings.getWaitForChunks() && RenderChunk.renderChunksUpdated != 0) || mc.currentScreen instanceof GuiCancelRender)) { - MCTimerHandler.setTimerSpeed(0f); - MCTimerHandler.setPartialTicks(0f); - MCTimerHandler.setRenderPartialTicks(0f); - MCTimerHandler.setTicks(0); + if(!firstTime) { + MCTimerHandler.setTimerSpeed(0f); + MCTimerHandler.setPartialTicks(0f); + MCTimerHandler.setRenderPartialTicks(0f); + MCTimerHandler.setTicks(0); + resetTimer = true; + } return; } else if (recording && ReplayMod.replaySettings.getWaitForChunks()) { MCTimerHandler.setTimerSpeed((float)lastSpeed); + //MCTimerHandler.setRenderPartialTicks(lastRenderPartialTicks); + if(resetTimer) { + MCTimerHandler.setPartialTicks(lastPartialTicks); + MCTimerHandler.setRenderPartialTicks(lastRenderPartialTicks); + MCTimerHandler.setTicks(lastTicks); + resetTimer = false; + } } - if(justCheck) return; if(recording) { @@ -317,6 +348,10 @@ public class ReplayProcess { EnchantmentTimer.increaseRecordingTime((1000/ReplayMod.replaySettings.getVideoFramerate())); } + lastPartialTicks = MCTimerHandler.getPartialTicks(); + lastRenderPartialTicks = MCTimerHandler.getRenderTicks(); + lastTicks = MCTimerHandler.getTicks(); + if(curTimestamp != null && curTimestamp != ReplayHandler.getDesiredTimestamp()) ReplayHandler.setReplayTime(curTimestamp); //splinePos = (index of last entry + add) / total entries diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index 86761aa2..01feec1c 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -78,11 +78,12 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { private long currentTimeStamp; private boolean hurryToTimestamp; - private long desiredTimeStamp; + private long desiredTimeStamp = -1; + private long toleratedTimeStamp = -1; private long lastTimeStamp, lastPacketSent; private boolean hasRestarted = false; - + private File replayFile; private boolean active = true; private ZipFile archive; @@ -95,6 +96,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { private boolean terminate = false; private double replaySpeed = 1f; + + private boolean hasWorldLoaded = false; private Field joinPacketEntityId, joinPacketWorldType, joinPacketDimension, joinPacketDifficulty, joinPacketMaxPlayers; @@ -130,7 +133,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { public int replayLength() { return replayLength; } - + public void stopHurrying() { hurryToTimestamp = false; } @@ -148,15 +151,27 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { public long getDesiredTimestamp() { return desiredTimeStamp; } + + public void resetToleratedTimeStamp() { + toleratedTimeStamp = -1; + } public void jumpToTime(int millis) { if(!(ReplayHandler.isInPath() && ReplayProcess.isVideoRecording())) setReplaySpeed(replaySpeed); if((millis < currentTimeStamp && !isHurrying())) { + if(ReplayHandler.isInPath()) { + if(millis >= toleratedTimeStamp && toleratedTimeStamp >= 0) { + return; + } + } startFromBeginning = true; } desiredTimeStamp = millis; + if(ReplayHandler.isInPath()) { + toleratedTimeStamp = millis; + } hurryToTimestamp = true; } @@ -246,15 +261,16 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { while(!terminate) { if(startFromBeginning) { hasRestarted = true; + hasWorldLoaded = false; currentTimeStamp = 0; dis.close(); dis = new DataInputStream(archive.getInputStream(replayEntry)); startFromBeginning = false; lastPacketSent = System.currentTimeMillis(); - ReplayHandler.restartReplay(); + ReplayHandler.restartReplay(); } - while(!terminate && !startFromBeginning && (!paused() || FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class))) { + while(!terminate && !startFromBeginning && (!paused() || !hasWorldLoaded)) { try { /* * LOGIC: @@ -277,8 +293,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { currentTimeStamp = pd.getTimestamp(); //System.out.println(currentTimeStamp); - if(!ReplayHandler.isInPath() && !hurryToTimestamp && (mc.theWorld != null && mc.theWorld.getChunkProvider().getLoadedChunkCount() > 0)) { - //if(!hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) { + if(!ReplayHandler.isInPath() && !hurryToTimestamp && hasWorldLoaded) { int timeWait = (int)Math.round((currentTimeStamp - lastTimeStamp)/replaySpeed); long timeDiff = System.currentTimeMillis() - lastPacketSent; lastPacketSent = System.currentTimeMillis(); @@ -599,6 +614,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { */ if(p instanceof S08PacketPlayerPosLook) { + if(!hasWorldLoaded) hasWorldLoaded = true; final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook)p; if(ReplayHandler.isInPath() && !hurryToTimestamp) return;