diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/builtin/OptionsFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/builtin/OptionsFileCommandExtension.java index 48480334..c44a7e5f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/builtin/OptionsFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/builtin/OptionsFileCommandExtension.java @@ -102,6 +102,12 @@ public void onPlayback(long tick, InputContainer inputContainer) { } } + @Override + public void onRecord(long tick, InputContainer inputContainer) { + // TODO Auto-generated method stub + super.onRecord(tick, inputContainer); + } + @Override public void onClear() { try { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 9d1d440f..078c0729 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -105,6 +105,11 @@ public abstract class SerialiserFlavorBase implements Registerable { */ protected boolean processExtensions = true; + /** + * Rotation counter for clamping the yaw + */ + protected int yawRotations = 0; + /*============================================== _____ _ _ _ / ____| (_) | (_) @@ -488,7 +493,7 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { * @return The serialised camera angle subtick */ protected String serialiseCameraAngleSubtick(VirtualCameraAngle cameraAngleSubtick) { - return String.format("%s;%s", cameraAngleSubtick.getYaw(), cameraAngleSubtick.getPitch()); + return String.format("%s;%s", clampYaw(cameraAngleSubtick.getYaw()), cameraAngleSubtick.getPitch()); } /** @@ -1402,6 +1407,8 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri if (!"null".equals(cameraPitchString)) cameraPitch = deserialiseRelativeFloat("camera pitch", cameraPitchString, previousPitch); + cameraYaw = unclampYaw(cameraYaw, previousYaw); + out.updateFromState(cameraPitch, cameraYaw); previousYaw = cameraYaw; @@ -1749,6 +1756,44 @@ protected String charListToString(List charList) { return charString; } + /** + *

Clamps the yaw to a value between -180 and 180 + * @param yaw The yaw to clamp + * @return The clamped yaw + */ + protected Float clampYaw(Float yaw) { + if (yaw == null) + return yaw; + + while (yaw >= 180) + yaw -= 360; + while (yaw < -180) + yaw += 360; + return yaw; + } + + /** + *

Unclamping the yaw from a clamped value + *

Makes it so 170 and a previous value of -170 will return -190,
+ * removing the -180 180 clamp. Uses {@link #yawRotations} + * @param yaw The yaw to unclamp + * @param previous The previous yaw to compare against. + * @return The unclamped yaw + */ + protected Float unclampYaw(Float yaw, Float previous) { + if (previous == null || yaw == null) + return yaw; + + float clampedPrevious = clampYaw(previous); + if (clampedPrevious >= 0 && (clampedPrevious - yaw) > 180) { + yawRotations++; + } + if (clampedPrevious < 0 && (clampedPrevious - yaw) < -180) { + yawRotations--; + } + return yaw + (360 * yawRotations); + } + @Override public String toString() { return getExtensionName(); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 6fc1d439..dc14c380 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -1062,6 +1062,20 @@ void testJoinNotEmpty() { assertEquals(expected, actual); } + /** + * Testing {@link #clampYaw(Float)} to force the yaw between -180 and 180 + */ + @Test + void testYawClamping() { + assertEquals(-170f, clampYaw(190f)); + assertEquals(160f, clampYaw(-200f)); + } + + @Test + void testYawUnclamping() { + assertEquals(-190f, unclampYaw(170f, -170f)); + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } @@ -1078,5 +1092,4 @@ private ArrayList convertBigArrayListToArrayList(Big public SerialiserFlavorBase clone() { return new SerialiserFlavorBaseTest(); } - }