移动
CS:GO 的移动由通用 CGameMovement 与派生的 CCSGameMovement 实现。它是共享代码:服务器用它权威地执行 CUserCmd,客户端用同一份代码做预测。因此对手感的任何修改都必须保持两端一致,否则会表现为预测误差。
相关源码文件#
game/shared/gamemovement.cpp:通用移动框架game/shared/cstrike15/cs_gamemovement.cpp:CS:GO 定制game/shared/cstrike15/cs_shareddefs.cpp:速度常量
1. 入口与分派#
CCSGameMovement::ProcessMovement缓存CCSPlayer指针;休眠中的 Bot 直接跳过,其余交给基类:game/shared/cstrike15/cs_gamemovement.cpp:421-429。- 基类
PlayerMove依次CheckParameters、ReduceTimers、位置分类、Duck,再按移动类型分派:梯子、无碰撞、飞行、行走FullWalkMove、旁观等:game/shared/gamemovement.cpp:4994-5123。 FullWalkMove处理重力、出水跳、游泳与跳跃按键:game/shared/gamemovement.cpp:2287-2330。
2. CS:GO 的定制点#
| 定制 | 行为 | 证据 |
|---|---|---|
| 能否加速 | 只有 STATE_ACTIVE 且不在出水跳中的玩家,或观察者,才能加速 | game/shared/cstrike15/cs_gamemovement.cpp:432-448 |
| 禁止移动 | CanMove() 为假时清零移动量并屏蔽跳跃/方向键 | game/shared/cstrike15/cs_gamemovement.cpp:451-459 |
| 速度惩罚恢复 | 着地时 m_flVelocityModifier 以每秒 1/2.5 的速率恢复到 1 | game/shared/cstrike15/cs_gamemovement.cpp:463-470 |
| 视点高度 | 服务端按站立/空中蹲/已蹲设置视点偏移 | game/shared/cstrike15/cs_gamemovement.cpp:472-502 |
| 加速度 | 按当前武器最大速度缩放目标速度;蹲伏 ×0.34、静步 ×0.52;开镜的慢速狙击枪另有处理;静步接近目标速度时逐渐减小加速 | game/shared/cstrike15/cs_gamemovement.cpp:1251-1327、game/shared/cstrike15/cs_shareddefs.cpp:14-22 |
| 跳跃 | 死亡/出水跳/第三人称嘲讽/深水中不能跳;不允许按住跳跃连跳(除非 sv_autobunnyhopping) | game/shared/cstrike15/cs_gamemovement.cpp:627-703 |
| 连跳限速 | sv_enablebunnyhopping=0 时,起跳速度超过 1.1 × 最大速度 的部分被等比例裁掉 | game/shared/cstrike15/cs_gamemovement.cpp:596-622、game/shared/cstrike15/cs_gamemovement.cpp:705-707 |
| 起跳速度与体力 | 竖直初速为 sv_jump_impulse(默认 ≈302),体力(stamina)越高起跳越低;起跳/落地都会增加体力消耗 | game/shared/cstrike15/cs_gamemovement.cpp:49、game/shared/cstrike15/cs_gamemovement.cpp:741-772、game/shared/cstrike15/cs_gamemovement.cpp:1234-1248 |
| 蹲伏 | 自定义 Duck、FinishDuck、CanUnduck 与蹲伏速度裁剪 | game/shared/cstrike15/cs_gamemovement.cpp:829-964 |
| 梯子 | 自定义梯子判定、攀爬速度与横向速度系数 | game/shared/cstrike15/cs_gamemovement.cpp:526-579 |
加速度公式在默认配置下走“线性”分支:SV_ACCELERATE_EXPONENT_TIME 被定义为 0,因此指数加速分支不会执行,实际增量为 flStoredAccel * frametime * fAccelerationScale * 地面摩擦,并封顶到 addspeed:game/shared/cstrike15/cs_gamemovement.cpp:42、game/shared/cstrike15/cs_gamemovement.cpp:1335、game/shared/cstrike15/cs_gamemovement.cpp:1379-1394。
3. 与网络的关系#
- 体力、速度修正、蹲伏覆盖等移动状态是本地玩家专属的网络变量(只发给本人与 GOTV):
game/server/cstrike15/cs_player.cpp:419-426。 sv_staminajumpcost、sv_staminalandcost、sv_jump_impulse、sv_enablebunnyhopping、sv_autobunnyhopping都是FCVAR_REPLICATED,确保客户端预测使用与服务器相同的参数:game/shared/cstrike15/cs_gamemovement.cpp:28-29、game/shared/cstrike15/cs_gamemovement.cpp:49、game/shared/cstrike15/cs_gamemovement.cpp:596-597。
约束与边界#
TryPlayerMove、StepMove、CategorizePosition等碰撞/台阶处理在基类中,未逐行展开:game/shared/gamemovement.cpp:2850、game/shared/gamemovement.cpp:1758、game/shared/gamemovement.cpp:4147。- 地面摩擦、表面属性(
m_surfaceFriction)来自物理表面数据,取决于缺失的vphysics与内容文件。