diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java index 4426b69..186c750 100644 --- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java +++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java @@ -12,6 +12,7 @@ public final class BetterControlsConfig{ public final KeyBindingWithModifier keyToggleSprint = new KeyBindingWithModifier("key.bettercontrols.toggle_sprint"); public boolean doubleTapForwardToSprint = true; + public boolean tapSprintKeyAgainToStopSprinting = false; public boolean resumeSprintingAfterHittingObstacle = false; public final KeyBindingWithModifier keyToggleSneak = new KeyBindingWithModifier("key.bettercontrols.toggle_sneak"); diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java index d3fddd8..b7e3e73 100644 --- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java +++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java @@ -32,6 +32,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js Json.writeKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint); Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint); + Json.setBool(obj, "Sprint.TapToStop", cfg.tapSprintKeyAgainToStopSprinting); Json.setBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle); Json.writeKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak); @@ -58,6 +59,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js Json.readKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint); cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint); + cfg.tapSprintKeyAgainToStopSprinting = Json.getBool(obj, "Sprint.TapToStop", cfg.tapSprintKeyAgainToStopSprinting); cfg.resumeSprintingAfterHittingObstacle = Json.getBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle); Json.readKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak); diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java index 6e989a8..c418ea4 100644 --- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java +++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java @@ -53,6 +53,11 @@ public class BetterControlsScreen extends GameOptionsScreen{ y += ROW_HEIGHT; + generateLeftSideText(y, elements, Text.of("Tap 'Sprint' While Sprinting To Stop")); + elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.tapSprintKeyAgainToStopSprinting, value -> cfg.tapSprintKeyAgainToStopSprinting = value)); + + y += ROW_HEIGHT; + generateLeftSideText(y, elements, Text.of("Resume Sprinting After Hitting Obstacle")); elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.resumeSprintingAfterHittingObstacle, value -> cfg.resumeSprintingAfterHittingObstacle = value)); diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java index 8b29478..16330d7 100644 --- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java +++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java @@ -44,6 +44,7 @@ public final class PlayerTicker{ private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, mc().options.keyForward); private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, mc().options.keyJump); + private boolean waitingForSprintKeyRelease = false; private boolean stopSprintingAfterReleasingSprintKey = false; private boolean wasHittingObstacle = false; private boolean wasSprintingBeforeHittingObstacle = false; @@ -67,9 +68,26 @@ public final class PlayerTicker{ if (isSprintToggled){ stopSprintingAfterReleasingSprintKey = false; + waitingForSprintKeyRelease = false; } else if (wasSprintToggled){ stopSprintingAfterReleasingSprintKey = true; + waitingForSprintKeyRelease = false; + } + else if (cfg().tapSprintKeyAgainToStopSprinting){ + if (opts.keySprint.isPressed()){ + if (!waitingForSprintKeyRelease){ + waitingForSprintKeyRelease = true; + stopSprintingAfterReleasingSprintKey = player.isSprinting(); + } + } + else{ + if (player.isSprinting() && !waitingForSprintKeyRelease){ + stopSprintingAfterReleasingSprintKey = false; + } + + waitingForSprintKeyRelease = false; + } } if (stopSprintingAfterReleasingSprintKey && !opts.keySprint.isPressed()){