跳转至

Mod 加载

职责

mod_manager 发现 MOD_INFO、构建依赖图、选择可用/默认 Mod、记录各 world 的有序 active list、应用声明的 Mod migration/removal,并向数据 loader 提供有序 source set。

入口点

阅读 src/mod_manager.h、src/mod_manager.cpp。refresh_mod_list、load_modfile、 load_mods_list、check_mods_list 与 worldfactory 的创建/读取是主要入口。

数据所有权

manager 拥有发现的 MOD_INFORMATION、dependency state 与 migration map;WORLD 拥有 active Mod ID 顺序;各 factory 拥有从这些 Mod path 加载的具体对象。

依赖

Mod 加载依赖 filesystem path、modinfo.json、dependency-tree 规则、worldfactory、JSON dispatch、稳定 ID、obsoletion/migration data、localization 与可选 Lua manifest。

生命周期

启动时发现 core/user Mod 目录,验证 metadata/dependency;world 选择有序集合;协调缺失/ 重命名 Mod;随后按顺序加载数据和脚本;列表随 world 持久化。

不变量

Mod ID 唯一有效;不能依赖自身;dependency 位于 dependent 前;world order 无重复; 缺失 Mod 需明确 migration 或用户决定;source attribution 保留 Mod origin。

扩展点

metadata、dependency、conflict、obsoletion 与 migration 用数据表达。新 loader phase 必须 保持确定顺序、失败诊断、来源归属和 world 检查。

序列化

mods.json 保存 world 的有序 Mod ID,manager registry 重新发现。重命名/移除需提供 migration,不能静默重写或破坏已有 world。

测试

使用 tests/worldfactory_test.cpp、JSON loading、dependency error、duplicate ID、missing Mod、migration、conflict 和完整 example-Mod load;含 Lua 时加入 manifest 验证。

性能

发现与 JSON load 是启动成本。避免重复遍历目录、不稳定排序,以及为一个 metadata 查询重载全部 registry。

CCB 差异

CCB bundled Mod、migration table、Lua v5 manifest 与接受的上游内容构成自己的兼容集。 不能替换成其他项目的默认 Mod list 或加载政策。

技术债务

发现、用户决定、依赖解析和数据加载通过启动流程耦合。未来拆分必须先保持准确顺序与 诊断,再讨论行为变化。