diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java index 2389e83..3dd60dd 100644 --- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java +++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java @@ -10,6 +10,7 @@ public final class BetterControlsConfig{ private Path path; public boolean doubleTapForwardToSprint = true; + public boolean resumeSprintingAfterHittingObstacle = false; public boolean sneakingMovesCameraSmoothly = true; diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java index 740e98b..38e97c0 100644 --- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java +++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java @@ -31,6 +31,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js final JsonObject obj = new JsonObject(); Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint); + Json.setBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle); Json.setBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly); @@ -49,6 +50,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js final JsonObject obj = json.getAsJsonObject(); cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint); + cfg.resumeSprintingAfterHittingObstacle = Json.getBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle); cfg.sneakingMovesCameraSmoothly = Json.getBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly); diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java index 26fd9e2..066a74c 100644 --- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java +++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java @@ -42,6 +42,11 @@ public class BetterControlsScreen extends GameOptionsScreen{ generateLeftSideText(y, elements, Text.of("Double Tap 'Walk Forwards' To Sprint")); elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.doubleTapForwardToSprint, value -> cfg.doubleTapForwardToSprint = 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)); + y += ROW_HEIGHT; return y; } diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java index e146a79..9ce0cdb 100644 --- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java +++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java @@ -34,6 +34,9 @@ public final class PlayerTicker{ // Logic + private boolean wasHittingObstacle = false; + private boolean wasSprintingBeforeHittingObstacle = false; + private boolean wasSneakingBeforeTouchingGround = false; private boolean holdingSneakWhileTouchingGround = false; @@ -53,6 +56,25 @@ public final class PlayerTicker{ if (flightSpeed > 0F){ player.abilities.setFlySpeed(flightSpeed); } + + if (cfg().resumeSprintingAfterHittingObstacle){ + if (wasHittingObstacle != player.horizontalCollision){ + if (!wasHittingObstacle){ + wasSprintingBeforeHittingObstacle = player.isSprinting() || mc().options.keySprint.isPressed(); + } + else if (wasSprintingBeforeHittingObstacle){ + wasSprintingBeforeHittingObstacle = false; + player.setSprinting(true); + } + + // collision also stops when the player lets go of movement keys + wasHittingObstacle = player.horizontalCollision; + } + } + else{ + wasHittingObstacle = player.horizontalCollision; + wasSprintingBeforeHittingObstacle = false; + } } public void afterSuperCall(final ClientPlayerEntity player){