CD Code Digest Hub /GTA V

武器、伤害、爆炸与拾取交互

范围:weapons/、pickups/,连接角色武器组件与伤害事件。总入口:Summary。

7 分钟阅读 7 个章节 1 张图

1. 设计思路与对象划分#

战斗系统将武器定义、库存与装备、发射行为、命中查询、伤害结算和表现分开。CWeapon : fwRefAwareBase 并不是一个直接继承场景实体的可见模型;它可以关联 drawable entity,并持有弹药、状态和组件。可见枪械、库存中的武器条目、正在使用的武器实例不是同一对象。

子系统职责相关文件
info / modifiers / components武器、弹药、附件与参数修饰weapons/info、components、modifiers
inventory / WeaponManager持有、选择、装备及生命周期库存与角色武器组件协作
Weapon / Bullet / projectiles发射模式、弹道/碰撞、实体弹药Weapon.cpp、Bullet.cpp
WeaponDamage按目标类型处理命中和伤害Ped、车辆、物件与网络规则
Explosion / ExplosionInst爆炸实例、作用范围、冲量和伤害连接物理、玻璃、火与特效
Pickup / Placement / Rewards世界拾取物、生成位置、奖励收集与再生是独立生命周期

2. 从开火到结果#

图中是职责关系,体积武器有专用路径,不意味着所有 fire type 都必经同一个 Bullet 类。Weapon.cpp 515 行附近尤其值得注意:FIRE_TYPE_INSTANT_HIT 与 FIRE_TYPE_DELAYED_HIT 都进入 FireDelayedHit。不能凭类型名称断言前者一定是“调用瞬间同步完成一条射线”。

sFireParams 包含 firing entity、武器矩阵、可选起终点、flags、动画速率、脚本开火和车辆武器等上下文。默认起点来自武器矩阵,默认终点沿武器方向乘射程;其他函数可按目标实体或瞄准摄像机计算射击向量。枪口方向、摄像机瞄准和最终命中因此需要专门协调。

3. 子弹命中不是只有首个交点#

CBullet 保存速度、生命周期、伤害、穿透及防弹玻璃穿透条件、距离衰减和瞄准辅助相关信息。命中结构分 entry/exit impact,提供排序、预处理、穿过材料的计算,以及海水、防空区域等专用处理。

这种设计支持一次射击产生多段作用与多种反馈。几何相交、允许穿透、可造成伤害和只产生视觉效果是不同判断;IsImpactAesthetic 明确表达某些命中只服务于表现。不能用首个 ray hit 的实体直接代表最终受伤目标。

命中查询依赖 Physics 的 WorldProbe,目标类型判断又依赖场景实体层。改变过滤掩码或忽略实体名单,会同时改变武器、玻璃、附件和载具乘员相关行为。

4. 伤害、表现与网络条件#

CWeaponDamage::DoWeaponImpact 接收 shape results、伤害、flags、近战信息、距离衰减、是否收到 fire message、是否生成 VFX 等参数。实现根据目标分派到 Ped、Car 等路径,并查询 friendly fire、本地/clone 身份和网络允许伤害条件。

这说明远端开火消息的表现重建和本地伤害权责存在区别。若把每个收到的开火事件都无条件再次应用伤害,可能重复结算;若把所有 clone 路径都跳过,又可能丢失必要表现。确切权责需按对象类型和事件来源阅读,不能把系统概括成统一的服务器命中裁决模型。

爆炸也会检查 ignore-damage entity、车辆乘员伤害策略、爆炸拥有者、多人禁伤与遮挡。一次爆炸同时涉及物理冲量、碎片破坏、实体伤害和效果,其中任一项触发都不表示其他项必然触发。

近战 fire type 在这里返回 false,因为近战不由这条普通发射分支实现;相关任务、碰撞和 damage 接口需另行追踪。该返回不能被解读为项目不支持近战。

5. 拾取物将位置、实例和奖励分离#

CPickupManager 管理 collection info、placement regeneration、类型和位置数据。placement 描述可再生的世界位置,pickup 表示当前可收集实例,reward 决定对玩家或角色产生什么结果。物体消失、奖励发放、脚本通知和再次生成不是同一动作。

CPickupRewardAmmo::CanGive 不只检查当前弹药,还读取 pending collections 的奖励,避免多个尚未完成的收集请求仅依据旧库存判断可领取量。这是异步/延后结算中非常具体的一致性细节。CanGive 与 Give 分离也让资格与实际效果可复用。

脚本资源信息、收集者注册引用和网络 pickup placement 将拾取行为连接到脚本和多人生命周期。任务结束或远端实例消失时,需要同时处理实例、placement、未完成收集和奖励记录。

6. 技术取舍与诊断路线#

数据驱动武器定义提高扩展能力,复杂上下文则集中到 FireParams、damage flags 和 modifiers。优势是不同玩法共享底层链路;代价是开火、弹药、动画、网络和表现的状态组合较多。

定位射击异常可以按“意图 → 武器状态 → 发射分支 → 查询结果 → 权责/过滤 → 目标伤害 → 表现”记录。伤害不生效不一定是碰撞错误;看见弹痕也不保证有可结算伤害。性能重点是命中查询数、穿透处理、爆炸影响对象数、特效和网络事件量,本文没有运行测量数据。

7. 源码依据#

源码重点
Weapon.h实例、FireParams、弹药与射击接口
Weapon.cppFire、fire-type switch、projectile 创建
Bullet.hentry/exit impact、穿透、反馈与寿命
WeaponDamage.cppDoWeaponImpact、目标分派与网络条件
Explosion.cpp遮挡、拥有者和目标伤害规则
PickupManager.h收集、placement 和再生
PickupRewards.cppCanGive、pending collections、Give

关联:AI、世界规则、网络。