diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index 96918172..a9bf2eb9 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -1155,6 +1155,7 @@ public: float getServerWalkSpeed() const { return serverWalkSpeed_; } float getServerSwimSpeed() const { return serverSwimSpeed_; } float getServerFlightSpeed() const { return serverFlightSpeed_; } + float getServerRunBackSpeed() const { return serverRunBackSpeed_; } bool isPlayerRooted() const { return (movementInfo.flags & static_cast(MovementFlags::ROOT)) != 0; } diff --git a/include/rendering/camera_controller.hpp b/include/rendering/camera_controller.hpp index 5e26d62b..e68a8093 100644 --- a/include/rendering/camera_controller.hpp +++ b/include/rendering/camera_controller.hpp @@ -95,6 +95,7 @@ public: void setWalkSpeedOverride(float speed) { walkSpeedOverride_ = speed; } void setSwimSpeedOverride(float speed) { swimSpeedOverride_ = speed; } void setFlightSpeedOverride(float speed) { flightSpeedOverride_ = speed; } + void setRunBackSpeedOverride(float speed) { runBackSpeedOverride_ = speed; } void setMovementRooted(bool rooted) { movementRooted_ = rooted; } bool isMovementRooted() const { return movementRooted_; } void setGravityDisabled(bool disabled) { gravityDisabled_ = disabled; } @@ -280,6 +281,7 @@ private: float walkSpeedOverride_ = 0.0f; float swimSpeedOverride_ = 0.0f; float flightSpeedOverride_ = 0.0f; + float runBackSpeedOverride_ = 0.0f; // Server-driven root state: when true, block all horizontal movement input. bool movementRooted_ = false; // Server-driven gravity disable (levitate/hover): skip gravity accumulation. diff --git a/src/core/application.cpp b/src/core/application.cpp index 82b12114..afad190e 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -1012,6 +1012,7 @@ void Application::update(float deltaTime) { renderer->getCameraController()->setWalkSpeedOverride(gameHandler->getServerWalkSpeed()); renderer->getCameraController()->setSwimSpeedOverride(gameHandler->getServerSwimSpeed()); renderer->getCameraController()->setFlightSpeedOverride(gameHandler->getServerFlightSpeed()); + renderer->getCameraController()->setRunBackSpeedOverride(gameHandler->getServerRunBackSpeed()); renderer->getCameraController()->setMovementRooted(gameHandler->isPlayerRooted()); renderer->getCameraController()->setGravityDisabled(gameHandler->isGravityDisabled()); renderer->getCameraController()->setFeatherFallActive(gameHandler->isFeatherFalling()); diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index 2f588e27..f1da0403 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -318,7 +318,9 @@ void CameraController::update(float deltaTime) { if (useWoWSpeed) { // Movement speeds (WoW-like: Ctrl walk, default run, backpedal slower) if (nowBackward && !nowForward) { - speed = WOW_BACK_SPEED; + speed = (runBackSpeedOverride_ > 0.0f && runBackSpeedOverride_ < 100.0f + && !std::isnan(runBackSpeedOverride_)) + ? runBackSpeedOverride_ : WOW_BACK_SPEED; } else if (ctrlDown) { speed = (walkSpeedOverride_ > 0.0f && walkSpeedOverride_ < 100.0f && !std::isnan(walkSpeedOverride_)) ? walkSpeedOverride_ : WOW_WALK_SPEED;