CD Code Digest Hub /GTA V

在线自由模式与产业活动

10 分钟阅读 8 个章节 1 张图

返回总览。自由模式是在线世界的玩法协调层;产业、房产和各种临时活动以公共服务、独立脚本及通用内容框架共同构成,而非全都直接实现在一个 freemode.sc 中。

1. 常驻世界中的服务编排#

freemode.sc 的预游戏阶段登记大量广播块,运行时同时维护任务请求、活动、帮助、玩家状态、房产实例、车辆服务和内容开关。[S1] 玩家可以在世界里移动,同时存在电话、邀请、资产生产、对手活动和短事件,因此它更像一个持续协调者,而不是单局比赛脚本。

源码使用 SCRIPT_THREAD_DATA 将回调按每帧、分帧和长周期组织。其目的之一是控制大型常驻逻辑的更新时间;不能把巨量函数全部当成每帧无条件执行。[S2]

2. 产业循环不是一份账本#

从 Ambient 下 Biker、Gunrunning、Nightclub、Tuner、Fixer、HeistIsland、Summer2022、Christmas2022 等内容族,以及公共任务框架,可以归纳出产业活动通常跨越四种状态:资产/资格、自由模式启动请求、实际任务阶段、交易及统计结果。这是对模块协作的归纳,并非所有产业共享完全一样的数据结构。

内容族代表路径/文件主要扩展维度
改装铺与客户车辆Ambient/Tuner/Missions交付、抢劫、车辆列表与场所变体
事务所Ambient/Fixer/Missions安保合约、电话暗杀、VIP 合约
摩托帮/军火/夜总会Ambient/Summer2022/Missions 相应目录补给、研究、货物、管理与交付
海岛抢劫Ambient/HeistIsland/Missions前置准备、岛屿场景与任务阶段
移动实验室等Ambient/Christmas2022/Missionssetup/source/sell 等循环

这些是仓库中可见的内容分组,不等于当前所有功能开关启用,更不能由目录名推定线上最终发布时间或规则。

3. 通用内容框架:模板加覆写钩子#

fm_content_generic_core.sch 引入实体生成、敌人、车辆、交付、目标、奖励、HUD、音频、室内、小游戏、通缉、遥测等组件。[S3] 其默认钩子通过 #IF NOT DEFINED(...) 提供,实现了编译期可覆写的模板:

  • SETUP_VARIATION 确定变体。
  • COMMON_PREGAME/SETUP/CLEANUP 处理共同生命周期。
  • MISSION_CLIENT_INIT 与 MISSION_SERVER_INIT 区分本地和主机初始化。
  • MAINTAIN_MISSION_CLIENT/SERVER 扩展运行逻辑。
  • logic.Mission.* 函数指针补充退出、结束等行为。

这不是运行时动态插件系统,而是使用头文件组合、条件定义和函数指针,把可重用流程与内容差异接在一起。fm_content_drug_vehicle.sc 只有几条 USING,却装配了具体内容、补丁、随机事件层和 generic core。[S4]

4. 双状态机和共同事实#

框架的 PROCESS_PRE_GAME 设置网络脚本及 instance,等待网络脚本可用,初始化局部/实体索引,登记 serverBD 和 playerBD,设置不可暂停和实例信息。由 host 选择并广播随机 seed。[S3,L5009]

主循环先处理退出条件,再刷新常用玩家/host 状态,随后根据客户端阶段和共享阶段推进。一个客户端还未初始化完成时,如果共享阶段已经进入 REWARDS/END,会直接转到结束路径,而不是强行从头演出。这是迟加入/慢加载情况下很重要的恢复设计。

Drug Vehicle 内容将主机状态定义为前往事件、获取车辆、交付、结束;客户端额外有协助交付、夺回车辆等状态。[S5] 因而不同玩家可以看到不同目标提示,同时共享“哪辆车、现在处在哪个任务阶段”这一组事实。

5. 变体是扩大内容量的主要工具#

Drug Vehicle 从 serverBD.sMissionData 读取 variation/subvariation,并依据地点选择货物类型;某些地点允许多种随机选择,其他地点限制为固定类别。[S5,L105] 它展示的生产方法是:

  1. 固定目标循环和网络生命周期。
  2. 用 placement data 放置角色、车辆、目的地和触发范围。
  3. 用变体覆写目标顺序、难度、敌人布置、语音和奖励类别。
  4. 把少数真正不同的行为留给内容钩子。

这样可以增加空间和表现差异,而不为每个地点复制一整套网络脚本。代价是通用结构和 feature 宏更复杂,新增字段或改变钩子顺序时影响面很大。

6. 房产实例与室内活动#

AM_MP_PROPERTY_INT.sc 不只是加载一个室内模型:它有全员退出标志、座位访问请求、室内活动清理、房主关联进入、车库离开权限、室内切换和活动同步等逻辑。[S6]

房产身份、当前室内场景和在场玩家是三个概念。同一类内饰可以服务多个拥有者,因此玩法必须知道玩家进入的是哪个逻辑房产实例;同步房产状态也不等于每个客户端应该呈现所有实例中的活动。具体实例隔离应继续追 GlobalServerBD_PropertyInstances 与对应 property helpers,不能仅从“有实例 ID”断言其采用完整专用服务器分房。

座位等交互还需要占用仲裁。单机一把椅子只是一个动作点,多人则要处理同时请求、房主离开、全员退出、动画结束和资源清理。这是资产玩法复杂度超出“买一个室内场景”的原因。

7. 热参数与服务边界#

Net_Rank_Tunable_Loader.sc 分离初始默认值与填充 tunable,公共头还有多代参数集合。[S7] tunable 能调整配置,feature 宏控制编译内容,云内容文件描述任务数据,三者不是同一套热更新机制。不能据存在 tunable 就推断任意脚本逻辑都能在线替换。

收益最终还要与交易和统计衔接。临时任务显示“完成”与服务交易确认是不同状态,退出、重试及断线都必须明确处理。

源码证据#

编号位置
[S1]freemode.sc L14895 预游戏;L15093 起广播
[S2]Script_Thread_Update.sch L32、L154
[S3]fm_content_generic_core.sch L7 组件;L35 覆写;L3096 预留;L5009 初始化;L5405 主循环
[S4]fm_content_drug_vehicle.sc 入口组合
[S5]fm_content_drug_vehicle_core.sch L11/18 双状态;L105 地点变体
[S6]AM_MP_PROPERTY_INT.sc L321 全员退出;L8413 座位请求;L18651 非房主车辆权限
[S7]Net_Rank_Tunable_Loader.sc L23 初值;L8031 参数填充

[S1]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/freemode.sc> [S2]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/Script_Thread_Update.sch> [S3]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/Freemode_Content_Generics/fm_content_generic_core.sch> [S4]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/Ambient/Summer2020/Missions/Drug_Vehicle/fm_content_drug_vehicle.sc> [S5]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/Ambient/Summer2020/Missions/Drug_Vehicle/fm_content_drug_vehicle_core.sch> [S6]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/Ambient/AM_MP_PROPERTY_INT.sc> [S7]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/Net_Rank_Tunable_Loader.sc>