physics: apply server walk and swim speed overrides to CameraController

serverWalkSpeed_ and serverSwimSpeed_ were stored in GameHandler but
never exposed or synced to the camera controller. The controller used
hardcoded WOW_WALK_SPEED and speed*SWIM_SPEED_FACTOR regardless of
server-sent speed changes.

Add getServerWalkSpeed()/getServerSwimSpeed() accessors, walkSpeedOverride_
and swimSpeedOverride_ fields in CameraController, and sync all three
server speeds each frame. Both swim speed sites (main and camera-collision
path) now use the override when set. This makes Slow debuffs (walk speed),
Swim Form, and Engineering fins actually affect movement speed.
This commit is contained in:
Kelsi 2026-03-10 13:11:50 -07:00
parent f2337aeaa7
commit 701cb94ba6
4 changed files with 15 additions and 4 deletions

View file

@ -320,7 +320,8 @@ void CameraController::update(float deltaTime) {
if (nowBackward && !nowForward) {
speed = WOW_BACK_SPEED;
} else if (ctrlDown) {
speed = WOW_WALK_SPEED;
speed = (walkSpeedOverride_ > 0.0f && walkSpeedOverride_ < 100.0f && !std::isnan(walkSpeedOverride_))
? walkSpeedOverride_ : WOW_WALK_SPEED;
} else if (runSpeedOverride_ > 0.0f && runSpeedOverride_ < 100.0f && !std::isnan(runSpeedOverride_)) {
speed = runSpeedOverride_;
} else {
@ -507,7 +508,8 @@ void CameraController::update(float deltaTime) {
swimming = true;
// Swim movement follows look pitch (forward/back), while strafe stays
// lateral for stable control.
float swimSpeed = speed * SWIM_SPEED_FACTOR;
float swimSpeed = (swimSpeedOverride_ > 0.0f && swimSpeedOverride_ < 100.0f && !std::isnan(swimSpeedOverride_))
? swimSpeedOverride_ : speed * SWIM_SPEED_FACTOR;
float waterSurfaceZ = waterH ? (*waterH - WATER_SURFACE_OFFSET) : targetPos.z;
// For auto-run/auto-swim: use character facing (immune to camera pan)
@ -1518,7 +1520,8 @@ void CameraController::update(float deltaTime) {
if (inWater) {
swimming = true;
float swimSpeed = speed * SWIM_SPEED_FACTOR;
float swimSpeed = (swimSpeedOverride_ > 0.0f && swimSpeedOverride_ < 100.0f && !std::isnan(swimSpeedOverride_))
? swimSpeedOverride_ : speed * SWIM_SPEED_FACTOR;
float waterSurfaceCamZ = waterH ? (*waterH - WATER_SURFACE_OFFSET + eyeHeight) : newPos.z;
bool diveIntent = nowForward && (forward3D.z < -0.28f);