战斗、武器与通缉规则
返回总览。本篇关注脚本如何组织战斗规则、消费伤害事件和控制通缉;NPC 内部任务体系见AI 与 NPC 行为。射击、碰撞、伤害计算与动画主体在原生系统,不能把脚本的战斗阶段视为全部战斗实现。
1. 规则、行为与结果分层#
任务规定谁与谁敌对、允许什么武器、何时出现增援、是否进入警察追逐;原生 AI 与武器系统执行具体动作。伤害、死亡、任务失败和奖励分别属于不同层级,不能用“血量变零”直接替代所有任务目标与结算判断。
2. 发放武器不等于立刻持枪#
GIVE_WEAPON_TO_PED 对接 CommandGiveWeaponToPed。[S1,L216] 原生首先解析 Ped、处理特定死亡状态;对远端 clone 转发 CGiveWeaponEvent,并检查弹药字段可编码范围。本地路径通过 inventory 添加武器/弹药,再根据 bEquip 与角色状态决定是否装备。
在车辆中,它设置 backup weapon 并选择适合当前状态的武器;游泳或攀爬时也可能只存为 backup;普通状态才直接装备。因此库存中有武器、当前选中武器、手里显示武器、允许使用武器是四个不同问题。远端事件路径也不能直接假设完整复现本地 bForceIntoHand 等参数的所有语义。
脚本角色创建助手往往一次设置关系组、武器和行为属性。Franklin1 的创建路径与关系表就是例子。[S2,L2637、L7560] 同一场景中敌人、玩家、同伴、犬和旁观者具有不同关系;关系配置是战斗内容数据的一部分,并非只由人物模型自动决定。
3. 在线规则需要同时处理输入和角色状态#
FMMC 的 PROCESS_RULE_WEAPON_DISABLING 根据本地玩家队伍与当前最高优先级规则处理战斗限制。[S3,L2186] 禁止近战时既逐帧禁用多种输入,也设置 PCF_DisableMelee;规则解除时根据本地标记撤销该配置。
对无武器规则,代码还处理当前 Ped 武器、车辆武器及武器选择输入。可见设计并非“隐藏武器轮就算禁止射击”。界面、控制、实际选中武器和角色配置需要共同满足规则。
这里还区分持续限制与进入阶段时的效果:START_UNARMED 结合“本帧队伍获得新优先级”的标志触发,而持续 REMOVE_WEAPONS 分支保持限制。若把所有初始化效果放到每帧执行,会不断覆盖玩家合法变化;若把帧级禁用仅执行一次,又可能下一帧失效。
这些是客户端规则实施机制,不能据此判断整个在线系统的服务端验证强度;也不能把本机禁用输入当作网络可信性证明。
4. 伤害事件将原生战斗结果转回玩法事实#
fm_content_generic_core.sch 的 PROCESS_DAMAGE_EVENT 从网络事件队列读取 STRUCT_ENTITY_DAMAGE_EVENT,先提供 HANDLE_DAMAGE_EVENT 内容钩子,再检查受害实体及类型,处理任务 NPC、玩家、警察等分支。[S4,L2181]
SHOULD_PED_REACT_ON_DAMAGE 的判断细节很有代表性:未被摧毁的受害者返回 TRUE;受害者被摧毁时,再依据攻击者当前消音武器状态和近战标志决定是否触发此类反应。[S4,L2155] 它只是一条受伤反应路径,不能据此概括成“消音击杀绝不会惊动任何 NPC”,因为视线、其他事件和场景规则仍可能产生反应。
框架把观察到的受伤写入 Ped client bit 等状态,再由后续逻辑推进警戒或目标。这是“原生事件—内容语义—共享任务状态”的转换,而不是让每个内容脚本自行重做弹道和伤害系统。内容自定义钩子在默认受害实体检查之前执行,扩展者应自行核对使用句柄的前提。
5. 通缉是有时间与调度语义的系统#
SET_PLAYER_WANTED_LEVEL 进入 CommandAlterWantedLevel,再调用玩家的 CWanted。[S5,L387] 降低等级与提高等级使用不同延迟处理;SET_PLAYER_WANTED_LEVEL_NOW 则调整生效时间并立即更新,在线使用同步时间来源。[S5,L444] 因而“设置目标星级”和“让变化现在生效”是不同接口。
SET_MAX_WANTED_LEVEL 修改最大等级;SET_WANTED_LEVEL_MULTIPLIER 修改本地玩家的倍率;difficulty 接口又写入 wanted overrides。这些改变不同维度,不能互相替代。通缉区域半径、阈值和逃脱时间还通过 CDispatchData 获取,实际警力调度与追逐行为由原生系统继续处理。
Franklin1 在不同阶段设置关系、wanted multiplier 和星级,并在退出相关路径恢复。[S2] 任务用这些能力控制“精心编排的交火”与“开放世界追逐”之间的转换;结束时遗漏倍率或上限恢复,会影响之后的世界规则,因此应把它们纳入清理协议。
6. 在线通缉还有显示连续性与重生恢复#
fm_content_generic_wanted.sch 将默认等级、强制保持、假星级、事件延迟、重生、室内及载具乘员逻辑分别维护。[S6]
| 状态 | 用途 | 关键细节 |
|---|---|---|
| 真实 wanted | 原生警察反应与追逐状态 | 由 wanted Native 更新 |
| fake wanted | 重生、室内转换等阶段的显示连续性 | 使用专门 Native 和 bit,另有清理函数 |
| forced wanted | 内容要求维持追逐压力 | 每帧抑制隐藏降星、更新 wanted position |
| pending event | 延迟应用一项通缉请求 | 保存等级、延迟、是否伤害警察等数据 |
| stored/respawn wanted | 跨重生等局部中断恢复 | 等玩家和画面状态适宜,再安排恢复 |
事件接收器检查数据读取结果及任务类型是否匹配,再写本地待处理结构。[S6,L221] 真正应用时还检查房产内部、当前等级、贿赂警察、内容钩子等条件。收到请求不代表立刻执行,也不代表一定执行。
重生/室内相关路径在条件合适时请求带延迟的 wanted 恢复,fake wanted 保持表现连贯。这展示了大型玩法常见的“逻辑状态暂时不可应用,先维持表现,再重建实际状态”方法。判断通缉问题时应同时看真实值、显示值和待处理事件,不能只看屏幕星星。
7. 内容填充与维护要点#
战斗差异可以由关系组、武器组合、掩体、波次、警戒条件、通缉阶段和队伍规则共同构造,无需为每场交火重写 AI。手工任务适合精确节奏,通用在线模式适合用数据和钩子扩充规则组合。
审查一个新战斗环节时,应追踪进入时的规则、运行中的状态反馈、失败/重生后的恢复,以及退出时的撤销。网络环境还要区分观察到伤害、本机实体控制权与脚本主机推进资格。本文没有测量战斗性能或验证命中/反作弊效果。
源码证据#
| 编号 | 阅读位置 |
|---|---|
| [S1] | commands_weapon.cpp L216 发放、clone 事件与装备分支 |
| [S2] | Franklin1.sc L2637 关系与武器;L7560 关系矩阵;L8546 起通缉阶段控制 |
| [S3] | FM_Mission_Controller_Main.sch L2186–2254 武器与输入规则 |
| [S4] | fm_content_generic_core.sch L2155 受伤反应;L2181 伤害事件;L2281 client bit |
| [S5] | commands_player.cpp L347/381 DispatchData;L387/444 wanted;L759 上限;L980/991 倍率和难度 |
| [S6] | fm_content_generic_wanted.sch L33 fake;L102 forced;L137 准入;L173 应用;L221 接收;L308 恢复;L426 维护 |
[S1]: <../../../GTAV Source/src/dev_ng/game/script/commands_weapon.cpp> [S2]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/missions/Franklin/Franklin1.sc> [S3]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/FM_Mission_Creator/FM_Mission_Controller/FM_Mission_Controller_Main.sch> [S4]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/Freemode_Content_Generics/fm_content_generic_core.sch> [S5]: <../../../GTAV Source/src/dev_ng/game/script/commands_player.cpp> [S6]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/Freemode_Content_Generics/fm_content_generic_wanted.sch>