diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index c26f152b..96918172 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -1154,6 +1154,7 @@ public: float getServerRunSpeed() const { return serverRunSpeed_; } float getServerWalkSpeed() const { return serverWalkSpeed_; } float getServerSwimSpeed() const { return serverSwimSpeed_; } + float getServerFlightSpeed() const { return serverFlightSpeed_; } 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 754de661..5e26d62b 100644 --- a/include/rendering/camera_controller.hpp +++ b/include/rendering/camera_controller.hpp @@ -94,6 +94,7 @@ public: void setRunSpeedOverride(float speed) { runSpeedOverride_ = speed; } void setWalkSpeedOverride(float speed) { walkSpeedOverride_ = speed; } void setSwimSpeedOverride(float speed) { swimSpeedOverride_ = speed; } + void setFlightSpeedOverride(float speed) { flightSpeedOverride_ = speed; } void setMovementRooted(bool rooted) { movementRooted_ = rooted; } bool isMovementRooted() const { return movementRooted_; } void setGravityDisabled(bool disabled) { gravityDisabled_ = disabled; } @@ -278,6 +279,7 @@ private: float runSpeedOverride_ = 0.0f; float walkSpeedOverride_ = 0.0f; float swimSpeedOverride_ = 0.0f; + float flightSpeedOverride_ = 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 10a69def..82b12114 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -1011,6 +1011,7 @@ void Application::update(float deltaTime) { renderer->getCameraController()->setRunSpeedOverride(gameHandler->getServerRunSpeed()); renderer->getCameraController()->setWalkSpeedOverride(gameHandler->getServerWalkSpeed()); renderer->getCameraController()->setSwimSpeedOverride(gameHandler->getServerSwimSpeed()); + renderer->getCameraController()->setFlightSpeedOverride(gameHandler->getServerFlightSpeed()); 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 5d536b33..2f588e27 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -714,7 +714,10 @@ void CameraController::update(float deltaTime) { if (flyDescend) flyMove.z -= 1.0f; if (glm::length(flyMove) > 0.001f) { flyMove = glm::normalize(flyMove); - targetPos += flyMove * speed * physicsDeltaTime; + float flySpeed = (flightSpeedOverride_ > 0.0f && flightSpeedOverride_ < 200.0f + && !std::isnan(flightSpeedOverride_)) + ? flightSpeedOverride_ : speed; + targetPos += flyMove * flySpeed * physicsDeltaTime; } targetPos.z += verticalVelocity * physicsDeltaTime; // Skip all ground physics — go straight to collision/WMO sections