CD Code Digest Hub /CS:GO

移动

7 分钟阅读 5 个章节

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 的速率恢复到 1game/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 与内容文件。