From 7bc357451596a16ed995e265b193de82ed4653e9 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Thu, 30 Jul 2015 11:29:45 +0200 Subject: [PATCH] When setting the last camera position before a time jump, a boolean has to be passed indicating whether that position should be enforced or ignored if it's out of a reasonable distance from the player's position. This is used by the GuiMarkerTimeline to ensure that jumping to Marker Keyframes actually results in the Marker Keyframe's Position. The actual code handling Position jumping after Time jumping was moved to the ReplayHandler and is now also called when jumping using the "Please wait" Screen. --- .../timelines/GuiKeyframeTimeline.java | 3 ++- .../elements/timelines/GuiMarkerTimeline.java | 6 ++++-- .../gui/overlay/GuiReplayOverlay.java | 7 +++++-- .../replaymod/replay/ReplayHandler.java | 21 ++++++++++++++++++- .../replaymod/replay/ReplaySender.java | 9 +------- 5 files changed, 32 insertions(+), 14 deletions(-) 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);