public static void SV_WaterMove() { // // user intentions // Vector3 pangle = ToVector(ref sv_player.v.v_angle); Mathlib.AngleVectors(ref pangle, out forward, out right, out up); Vector3 wishvel = forward * cmd.forwardmove + right * cmd.sidemove; if (cmd.forwardmove == 0 && cmd.sidemove == 0 && cmd.upmove == 0) { wishvel.Z -= 60; // drift towards bottom } else { wishvel.Z += cmd.upmove; } float wishspeed = wishvel.Length; if (wishspeed > sv_maxspeed.value) { wishvel *= sv_maxspeed.value / wishspeed; wishspeed = sv_maxspeed.value; } wishspeed *= 0.7f; // // water friction // float newspeed, speed = Mathlib.Length(ref sv_player.v.velocity); if (speed != 0) { newspeed = (float)(speed - host_framtime * speed * sv_friction.value); if (newspeed < 0) { newspeed = 0; } Mathlib.VectorScale(ref sv_player.v.velocity, newspeed / speed, out sv_player.v.velocity); } else { newspeed = 0; } // // water acceleration // if (wishspeed == 0) { return; } float addspeed = wishspeed - newspeed; if (addspeed <= 0) { return; } Mathlib.Normalize(ref wishvel); float accelspeed = (float)(sv_accelerate.value * wishspeed * host_framtime); if (accelspeed > addspeed) { accelspeed = addspeed; } wishvel *= accelspeed; sv_player.v.velocity.x += wishvel.X; sv_player.v.velocity.y += wishvel.Y; sv_player.v.velocity.z += wishvel.Z; }