diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java index 43555729..3785c711 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java @@ -76,7 +76,8 @@ public class GuiKeyframeTimeline extends GuiTimeline { } else if(button == 1) { if(closest != null) { if(closest.getValue() instanceof AdvancedPosition) { - ReplayHandler.getCameraEntity().moveAbsolute((AdvancedPosition)closest.getValue()); + AdvancedPosition pos = (AdvancedPosition)closest.getValue(); + ReplayHandler.getCameraEntity().movePath(pos); } else if(closest.getValue() instanceof TimestampValue) { ReplayMod.overlay.performJump(((TimestampValue)closest.getValue()).asInt()); } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java index 7c84a3c6..6ae4e025 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java @@ -66,8 +66,10 @@ public class GuiMarkerTimeline extends GuiTimeline { } else if(button == 1) { if(closest != null) { - //Jump to clicked Marker Keyframe - ReplayHandler.setLastPosition(closest.getValue().getPosition()); + //Jump to clicked Marker Keyframe (explicitly force to jump to this position) + ReplayHandler.setLastPosition(closest.getValue().getPosition(), true); + + //perform the jump, telling the Overlay not to override the last position value ReplayMod.overlay.performJump(closest.getRealTimestamp(), false); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/overlay/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/gui/overlay/GuiReplayOverlay.java index c2675b10..4aa4f9ca 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/overlay/GuiReplayOverlay.java @@ -458,9 +458,9 @@ public class GuiReplayOverlay extends Gui { if(setLastPosition) { CameraEntity cam = ReplayHandler.getCameraEntity(); if(cam != null) { - ReplayHandler.setLastPosition(new AdvancedPosition(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw)); + ReplayHandler.setLastPosition(new AdvancedPosition(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw), false); } else { - ReplayHandler.setLastPosition(null); + ReplayHandler.setLastPosition(null, false); } } @@ -527,6 +527,9 @@ public class GuiReplayOverlay extends Gui { e.printStackTrace(); // This should never be thrown but whatever } + //finally, updating the camera's position (which is not done by the sync jumping) + ReplayHandler.moveCameraToLastPosition(); + // No need to remove our please-wait-screen. It'll vanish with the next // render pass as it's never been a real GuiScreen in the first place. } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java index 525855e4..4b08c0f6 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java @@ -518,8 +518,27 @@ public class ReplayHandler { return lastPosition; } - public static void setLastPosition(AdvancedPosition position) { + @Getter + private static boolean forceLastPosition = false; + + public static void setLastPosition(AdvancedPosition position, boolean force) { lastPosition = position; + forceLastPosition = force; + } + + public static void moveCameraToLastPosition() { + //get the camera position we had before jumping in time + AdvancedPosition pos = ReplayHandler.getLastPosition(); + CameraEntity cam = ReplayHandler.getCameraEntity(); + if (cam != null && pos != null) { + // Move camera back in case we have been respawned, unless we're more than ReplayMod.TP_DISTANCE_LIMIT away from that point + // this is ignored if we explicitly said to respect this position, e.g. when jumping to marker keyframes. + if (ReplayHandler.isForceLastPosition() || + (Math.abs(pos.getX() - cam.posX) < ReplayMod.TP_DISTANCE_LIMIT && + Math.abs(pos.getZ() - cam.posZ) < ReplayMod.TP_DISTANCE_LIMIT)) { + cam.moveAbsolute(pos); + } + } } public static File getReplayFile() { diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index 2aa45b1b..d788d655 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -540,14 +540,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if (isHurrying() && lastTimeStamp > desiredTimeStamp && !startFromBeginning) { desiredTimeStamp = -1; - AdvancedPosition pos = ReplayHandler.getLastPosition(); - CameraEntity cam = ReplayHandler.getCameraEntity(); - if (cam != null && pos != null) { - // Move camera back in case we have been respawned - if (Math.abs(pos.getX() - cam.posX) < ReplayMod.TP_DISTANCE_LIMIT && Math.abs(pos.getZ() - cam.posZ) < ReplayMod.TP_DISTANCE_LIMIT) { - cam.moveAbsolute(pos); - } - } + ReplayHandler.moveCameraToLastPosition(); // Pause after jumping setReplaySpeed(0);