From e2f65dfc591dbde4b03a66966621d45496f88d91 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Tue, 10 Mar 2026 14:05:50 -0700 Subject: [PATCH] physics: add server flight-back speed override to CameraController SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE was already ACK'd and stored in serverFlightBackSpeed_, but the value was never accessible or synced to the CameraController. Backward flight movement always used forward flight speed (flightSpeedOverride_), making it faster than the server intended. - Add getServerFlightBackSpeed() accessor in GameHandler - Add flightBackSpeedOverride_ field and setter in CameraController - Apply it in the fly movement block: backward-only flight uses the back speed; forward or strafing uses the forward speed as WoW does - Fallback: 50% of forward flight speed when override is unset - Sync per-frame in application.cpp alongside the other speed overrides --- include/game/game_handler.hpp | 1 + include/rendering/camera_controller.hpp | 2 ++ src/core/application.cpp | 1 + src/rendering/camera_controller.cpp | 10 +++++++--- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index 100e2640..af623646 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -1156,6 +1156,7 @@ public: float getServerSwimSpeed() const { return serverSwimSpeed_; } float getServerSwimBackSpeed() const { return serverSwimBackSpeed_; } float getServerFlightSpeed() const { return serverFlightSpeed_; } + float getServerFlightBackSpeed() const { return serverFlightBackSpeed_; } 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 e93ad241..c13df29b 100644 --- a/include/rendering/camera_controller.hpp +++ b/include/rendering/camera_controller.hpp @@ -96,6 +96,7 @@ public: void setSwimSpeedOverride(float speed) { swimSpeedOverride_ = speed; } void setSwimBackSpeedOverride(float speed) { swimBackSpeedOverride_ = speed; } void setFlightSpeedOverride(float speed) { flightSpeedOverride_ = speed; } + void setFlightBackSpeedOverride(float speed) { flightBackSpeedOverride_ = speed; } void setRunBackSpeedOverride(float speed) { runBackSpeedOverride_ = speed; } void setMovementRooted(bool rooted) { movementRooted_ = rooted; } bool isMovementRooted() const { return movementRooted_; } @@ -284,6 +285,7 @@ private: float swimSpeedOverride_ = 0.0f; float swimBackSpeedOverride_ = 0.0f; float flightSpeedOverride_ = 0.0f; + float flightBackSpeedOverride_ = 0.0f; float runBackSpeedOverride_ = 0.0f; // Server-driven root state: when true, block all horizontal movement input. bool movementRooted_ = false; diff --git a/src/core/application.cpp b/src/core/application.cpp index f6ff1229..b6bfc975 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -1013,6 +1013,7 @@ void Application::update(float deltaTime) { renderer->getCameraController()->setSwimSpeedOverride(gameHandler->getServerSwimSpeed()); renderer->getCameraController()->setSwimBackSpeedOverride(gameHandler->getServerSwimBackSpeed()); renderer->getCameraController()->setFlightSpeedOverride(gameHandler->getServerFlightSpeed()); + renderer->getCameraController()->setFlightBackSpeedOverride(gameHandler->getServerFlightBackSpeed()); renderer->getCameraController()->setRunBackSpeedOverride(gameHandler->getServerRunBackSpeed()); renderer->getCameraController()->setMovementRooted(gameHandler->isPlayerRooted()); renderer->getCameraController()->setGravityDisabled(gameHandler->isGravityDisabled()); diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index 4f315659..21bb1392 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -722,9 +722,13 @@ void CameraController::update(float deltaTime) { if (flyDescend) flyMove.z -= 1.0f; if (glm::length(flyMove) > 0.001f) { flyMove = glm::normalize(flyMove); - float flySpeed = (flightSpeedOverride_ > 0.0f && flightSpeedOverride_ < 200.0f - && !std::isnan(flightSpeedOverride_)) - ? flightSpeedOverride_ : speed; + float flyFwdSpeed = (flightSpeedOverride_ > 0.0f && flightSpeedOverride_ < 200.0f + && !std::isnan(flightSpeedOverride_)) + ? flightSpeedOverride_ : speed; + float flyBackSpeed = (flightBackSpeedOverride_ > 0.0f && flightBackSpeedOverride_ < 200.0f + && !std::isnan(flightBackSpeedOverride_)) + ? flightBackSpeedOverride_ : flyFwdSpeed * 0.5f; + float flySpeed = (nowBackward && !nowForward) ? flyBackSpeed : flyFwdSpeed; targetPos += flyMove * flySpeed * physicsDeltaTime; } targetPos.z += verticalVelocity * physicsDeltaTime;