From 99ef074af69f5dd87670749892ffd591f98643d0 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Wed, 18 Feb 2026 05:33:50 +0100 Subject: [PATCH 1/3] Added Freecam config option --- .../jsondefs/JSONConfigClient.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigClient.java b/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigClient.java index 8f6e1b185..c1f7b898a 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigClient.java +++ b/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigClient.java @@ -28,7 +28,8 @@ public static class JSONRenderingSettings { public JSONConfigEntry renderWindows = new JSONConfigEntry<>(true, "Should the glass on windows be rendered on vehicles?"); public JSONConfigEntry innerWindows = new JSONConfigEntry<>(false, "Should the glass on windows be rendered on the inside of the vehicle? Note: if renderWindows is false, this config has no effect."); - + public JSONConfigEntry freecam_3P = new JSONConfigEntry<>(false, "If true, third-person camera rotation in vehicles is disconnected from vehicle rotation and uses only rider look rotation."); + public JSONConfigEntry renderFlares = new JSONConfigEntry<>(true, "If false, flares on lights will not render."); public JSONConfigEntry renderBeams = new JSONConfigEntry<>(true, "If false, beams on lights will not render."); @@ -86,3 +87,4 @@ public static class ConfigJoystick { } } + From 9a28f3d20d5873988bc8953f1e83d671f4d36e2a Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Wed, 18 Feb 2026 05:37:49 +0100 Subject: [PATCH 2/3] Added Freecam config function to systems --- .../systems/CameraSystem.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mccore/src/main/java/minecrafttransportsimulator/systems/CameraSystem.java b/mccore/src/main/java/minecrafttransportsimulator/systems/CameraSystem.java index a96556a25..250fe518a 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/systems/CameraSystem.java +++ b/mccore/src/main/java/minecrafttransportsimulator/systems/CameraSystem.java @@ -130,9 +130,13 @@ public static boolean adjustCamera(IWrapperPlayer player, Point3D cameraAdjusted //No custom cameras, check if we are sitting in a seat to adjust orientation. if (sittingSeat != null) { cameraAdjustedPosition.set(sittingSeat.prevRiderCameraPosition).interpolate(sittingSeat.riderCameraPosition, partialTicks); - sittingSeat.getInterpolatedOrientation(cameraRotation, partialTicks); - sittingSeat.getRiderInterpolatedOrientation(riderOrientation, partialTicks); - cameraRotation.multiply(riderOrientation); + if (ConfigSystem.client.renderingSettings.freecam_3P.value && InterfaceManager.clientInterface.getCameraMode().thirdPerson) { + sittingSeat.getRiderInterpolatedOrientation(cameraRotation, partialTicks); + } else { + sittingSeat.getInterpolatedOrientation(cameraRotation, partialTicks); + sittingSeat.getRiderInterpolatedOrientation(riderOrientation, partialTicks); + cameraRotation.multiply(riderOrientation); + } return true; } else { //Not doing any camera changes. @@ -163,3 +167,4 @@ private CameraMode(boolean thirdPerson) { } } } + From 4b84781a020ae62a0944e6f22821669e60164d7d Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Wed, 18 Feb 2026 05:47:19 +0100 Subject: [PATCH 3/3] Tweaked camera computing fakery to support new config --- .../entities/components/AEntityB_Existing.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/components/AEntityB_Existing.java b/mccore/src/main/java/minecrafttransportsimulator/entities/components/AEntityB_Existing.java index 56fa8ff52..a20a658a3 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/components/AEntityB_Existing.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/components/AEntityB_Existing.java @@ -22,6 +22,7 @@ import minecrafttransportsimulator.sound.SoundInstance; import minecrafttransportsimulator.systems.CameraSystem; import minecrafttransportsimulator.systems.CameraSystem.CameraMode; +import minecrafttransportsimulator.systems.ConfigSystem; /** * Base class for entities that exist in the world. In addition to the normal functions @@ -284,16 +285,17 @@ public boolean updateRider() { CameraMode cameraMode = InterfaceManager.clientInterface.getCameraMode(); if (CameraSystem.activeCamera == null && cameraMode != CameraMode.FIRST_PERSON) { riderCameraPosition.set(riderEyePosition); + RotationMatrix cameraRotation = ConfigSystem.client.renderingSettings.freecam_3P.value ? riderRelativeOrientation : rider.getOrientation(); //Adjust eye position to account for zoom settings. int zoomRequired = 4 + zoomLevel; - riderTempPoint.set(0, 0, cameraMode == CameraMode.THIRD_PERSON ? -zoomRequired : zoomRequired).rotate(rider.getOrientation()); + riderTempPoint.set(0, 0, cameraMode == CameraMode.THIRD_PERSON ? -zoomRequired : zoomRequired).rotate(cameraRotation); riderEyePosition.add(riderTempPoint); //Check if camera should be where eyes are, or somewhere different. int cameraZoomRequired = 4 - InterfaceManager.clientInterface.getCameraDefaultZoom() + zoomLevel; if (zoomRequired != cameraZoomRequired) { - riderTempPoint.set(0, 0, cameraMode == CameraMode.THIRD_PERSON ? -cameraZoomRequired : cameraZoomRequired).rotate(rider.getOrientation()); + riderTempPoint.set(0, 0, cameraMode == CameraMode.THIRD_PERSON ? -cameraZoomRequired : cameraZoomRequired).rotate(cameraRotation); riderCameraPosition.add(riderTempPoint); } else { riderCameraPosition.add(riderTempPoint);