From 12ca7407c4044c4f006259f4c03264f909be86c4 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sun, 5 Jul 2026 19:52:02 -0400 Subject: [PATCH 1/3] New context config entries --- .../collinb/dynamicview/camera/CameraContext.java | 6 +++++- .../me/collinb/dynamicview/config/ModConfig.java | 15 +++++++++++++++ .../dynamicview/mixin/LocalPlayerMixin.java | 4 ---- .../resources/assets/dynamicview/lang/en_us.json | 8 ++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/me/collinb/dynamicview/camera/CameraContext.java b/common/src/main/java/me/collinb/dynamicview/camera/CameraContext.java index 7e92dbf..53f11a9 100644 --- a/common/src/main/java/me/collinb/dynamicview/camera/CameraContext.java +++ b/common/src/main/java/me/collinb/dynamicview/camera/CameraContext.java @@ -6,8 +6,12 @@ * declared one decides the perspective. */ public enum CameraContext { + AIMING, + LUNGING, + CLIMBING, RIDING, FLYING, SWIMMING, - CRAWLING + CRAWLING, + FISHING, } diff --git a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java index ce91ad4..9a770d0 100644 --- a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java +++ b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java @@ -43,6 +43,21 @@ public static class Contexts { @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) public CameraType ridingCamera = CameraType.THIRD_PERSON_BACK; + public boolean climbingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType climbingCamera = CameraType.FIRST_PERSON; + + public boolean fishingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType fishingCamera = CameraType.THIRD_PERSON_BACK; + + public boolean aimingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType aimingCamera = CameraType.FIRST_PERSON; + + public boolean lungingEnabled = false; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType lungingCamera = CameraType.THIRD_PERSON_BACK; } public boolean animationEnabled = true; diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java index e446f33..d87f540 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java @@ -13,10 +13,6 @@ @Mixin(LocalPlayer.class) public abstract class LocalPlayerMixin { - // Polling once per tick (instead of hooking mount/dismount and pose data - // updates) catches every way a context can start or stop: failed mount - // attempts, leaving water while still in the swimming pose, config changes - // mid-context, respawning, and so on. @Inject(method = "tick", at = @At("TAIL")) private void dynamicView$updateContexts(CallbackInfo ci) { LocalPlayer player = (LocalPlayer) (Object) this; diff --git a/common/src/main/resources/assets/dynamicview/lang/en_us.json b/common/src/main/resources/assets/dynamicview/lang/en_us.json index 7d396ca..a636c9f 100644 --- a/common/src/main/resources/assets/dynamicview/lang/en_us.json +++ b/common/src/main/resources/assets/dynamicview/lang/en_us.json @@ -9,6 +9,14 @@ "text.autoconfig.dynamicview.option.contexts.flyingCamera": "Flying Camera", "text.autoconfig.dynamicview.option.contexts.ridingEnabled": "Riding Enabled", "text.autoconfig.dynamicview.option.contexts.ridingCamera": "Riding Camera", + "text.autoconfig.dynamicview.option.contexts.climbingEnabled": "Climbing Enabled", + "text.autoconfig.dynamicview.option.contexts.climbingCamera": "Climbing Camera", + "text.autoconfig.dynamicview.option.contexts.fishingEnabled": "Fishing Enabled", + "text.autoconfig.dynamicview.option.contexts.fishingCamera": "Fishing Camera", + "text.autoconfig.dynamicview.option.contexts.aimingEnabled": "Aiming Enabled", + "text.autoconfig.dynamicview.option.contexts.aimingCamera": "Aiming Camera", + "text.autoconfig.dynamicview.option.contexts.lungingEnabled": "Lunging Enabled", + "text.autoconfig.dynamicview.option.contexts.lungingCamera": "Lunging Camera", "text.autoconfig.dynamicview.option.animationEnabled": "Enable Zoom Animation", "text.autoconfig.dynamicview.option.animationEnterSpeed": "Enter Animation Speed (%)", "text.autoconfig.dynamicview.option.animationExitSpeed": "Exit Animation Speed (%)" From be97bcf92f4bbf0d7d03c34ffc5782feb55b1592 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sun, 5 Jul 2026 20:34:41 -0400 Subject: [PATCH 2/3] Use Math.clamp, fix parameter name --- .../src/main/java/me/collinb/dynamicview/config/ModConfig.java | 2 +- .../src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java index 9a770d0..4fd1c4e 100644 --- a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java +++ b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java @@ -76,6 +76,6 @@ public void validatePostLoad() { } private static int clampSpeed(int speed) { - return Math.max(1, Math.min(100, speed)); + return Math.clamp(speed, 1, 100); } } diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java index 6ddf54a..a4e8fb4 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java @@ -12,7 +12,7 @@ public abstract class CameraMixin { @Inject(method = "getMaxZoom", at = @At("TAIL"), cancellable = true) - private void useSmoothZooming(float pMaxZoom, CallbackInfoReturnable cir) { + private void useSmoothZooming(float cameraDist, CallbackInfoReturnable cir) { CameraAnimation animation = CameraAnimation.INSTANCE; if (!animation.isAnimating()) { return; From eaa1e596fe10817200ba2f00349aff6eb7d1d68c Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sun, 5 Jul 2026 20:39:58 -0400 Subject: [PATCH 3/3] New context implementations (climbing, aiming, fishing, lunging) --- .../dynamicview/mixin/LocalPlayerMixin.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java index d87f540..cf6249e 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java @@ -5,6 +5,7 @@ import me.collinb.dynamicview.config.ModConfig; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.Pose; +import net.minecraft.world.item.BowItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,6 +19,7 @@ public abstract class LocalPlayerMixin { LocalPlayer player = (LocalPlayer) (Object) this; ModConfig.Contexts contexts = ModConfig.get().contexts; boolean swimmingPose = player.getPose() == Pose.SWIMMING; + boolean drawingBow = player.isUsingItem() && player.getUseItem().getItem() instanceof BowItem; DynamicView.setContextActive(CameraContext.RIDING, contexts.ridingEnabled && player.getVehicle() != null, @@ -31,5 +33,17 @@ public abstract class LocalPlayerMixin { DynamicView.setContextActive(CameraContext.CRAWLING, contexts.crawlingEnabled && swimmingPose && !player.isInWater(), contexts.crawlingCamera); + DynamicView.setContextActive(CameraContext.CLIMBING, + contexts.climbingEnabled && player.onClimbable(), + contexts.climbingCamera); + DynamicView.setContextActive(CameraContext.AIMING, + contexts.aimingEnabled && drawingBow, + contexts.aimingCamera); + DynamicView.setContextActive(CameraContext.FISHING, + contexts.fishingEnabled && player.fishing != null, + contexts.fishingCamera); + DynamicView.setContextActive(CameraContext.LUNGING, + contexts.lungingEnabled && player.isAutoSpinAttack(), + contexts.lungingCamera); } }