在线自由模式与产业活动
返回总览。自由模式是在线世界的玩法协调层;产业、房产和各种临时活动以公共服务、独立脚本及通用内容框架共同构成,而非全都直接实现在一个 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/Missions | setup/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] 它展示的生产方法是:
- 固定目标循环和网络生命周期。
- 用 placement data 放置角色、车辆、目的地和触发范围。
- 用变体覆写目标顺序、难度、敌人布置、语音和奖励类别。
- 把少数真正不同的行为留给内容钩子。
这样可以增加空间和表现差异,而不为每个地点复制一整套网络脚本。代价是通用结构和 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>