diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index 9e5ad6a7..100e2640 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 getServerSwimBackSpeed() const { return serverSwimBackSpeed_; } float getServerFlightSpeed() const { return serverFlightSpeed_; } float getServerRunBackSpeed() const { return serverRunBackSpeed_; } bool isPlayerRooted() const { diff --git a/include/rendering/camera_controller.hpp b/include/rendering/camera_controller.hpp index 2471fb8d..e93ad241 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 setSwimBackSpeedOverride(float speed) { swimBackSpeedOverride_ = speed; } void setFlightSpeedOverride(float speed) { flightSpeedOverride_ = speed; } void setRunBackSpeedOverride(float speed) { runBackSpeedOverride_ = speed; } void setMovementRooted(bool rooted) { movementRooted_ = rooted; } @@ -281,6 +282,7 @@ private: float runSpeedOverride_ = 0.0f; float walkSpeedOverride_ = 0.0f; float swimSpeedOverride_ = 0.0f; + float swimBackSpeedOverride_ = 0.0f; float flightSpeedOverride_ = 0.0f; float runBackSpeedOverride_ = 0.0f; // Server-driven root state: when true, block all horizontal movement input. diff --git a/src/core/application.cpp b/src/core/application.cpp index a5df593e..f6ff1229 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()->setSwimBackSpeedOverride(gameHandler->getServerSwimBackSpeed()); renderer->getCameraController()->setFlightSpeedOverride(gameHandler->getServerFlightSpeed()); renderer->getCameraController()->setRunBackSpeedOverride(gameHandler->getServerRunBackSpeed()); renderer->getCameraController()->setMovementRooted(gameHandler->isPlayerRooted()); diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index c4e93e3c..4f315659 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -537,6 +537,10 @@ void CameraController::update(float deltaTime) { // Use character's facing direction for strafe, not camera's right vector glm::vec3 swimRight = right; // Character's right (horizontal facing), not camera's + float swimBackSpeed = (swimBackSpeedOverride_ > 0.0f && swimBackSpeedOverride_ < 100.0f + && !std::isnan(swimBackSpeedOverride_)) + ? swimBackSpeedOverride_ : swimSpeed * 0.5f; + glm::vec3 swimMove(0.0f); if (nowForward) swimMove += swimForward; if (nowBackward) swimMove -= swimForward; @@ -545,7 +549,9 @@ void CameraController::update(float deltaTime) { if (glm::length(swimMove) > 0.001f) { swimMove = glm::normalize(swimMove); - targetPos += swimMove * swimSpeed * physicsDeltaTime; + // Use backward swim speed when moving backwards only (not when combining with strafe) + float applySpeed = (nowBackward && !nowForward) ? swimBackSpeed : swimSpeed; + targetPos += swimMove * applySpeed * physicsDeltaTime; } // Spacebar = swim up (continuous, not a jump)