配置加载机制
基本信息
| 属性 | 值 |
|---|---|
| 配置目录 | <游戏目录>/config/bdlib(BdLib.scala:64) |
| 加载入口 | RecipesHelper.loadConfigs(...) |
| 内置清单 | assets/bdlib/config/files.lst |
| 覆盖目录 | config/bdlib/overrides/ |
| 用户配置 | config/bdlib/*.cfg(按字母序) |
| 首次启动生成 | readme.txt |
功能
BD lib 的配置系统同时服务两件事:加载本模组自身的网络白名单,以及为下游模组提供同一套加载机制的模板。
加载顺序
RecipesHelper.loadConfigs(recipes/RecipesHelper.scala:31-93)严格按以下顺序处理:
- 读取内置清单 — 以
listResource打开 jar 内的清单文件(本模组为/assets/bdlib/config/files.lst),逐行读取并过滤掉以#开头的注释行与空行。 - 逐个处理内置文件 — 对清单中每个文件名,先检查
<configDir>/overrides/<文件名>是否存在(RecipesHelper.scala:54-55):- 存在 → 读覆盖文件,日志路径为该文件的
getCanonicalPath - 不存在 → 读 jar 内的
resBaseName + 文件名,日志路径为该资源的 URL - 若
overrides目录不存在则先mkdir()创建。
- 存在 → 读覆盖文件,日志路径为该文件的
- 加载用户配置 — 遍历
configDir.list().sorted,筛选出所有以.cfg结尾且可读的文件,按字母序逐个加载(RecipesHelper.scala:81)。
日志格式统一为 Loading config: %s,结束后输出 Config loading for mod %s finished。
首次启动的 readme
NetworkSecurityLoader.loadConfigFiles(network/NetworkSecurityConfig.scala:24-35)在配置目录不存在时创建目录并写入 readme.txt,内容为两行说明:
- 本目录下所有
.cfg文件会在内置配置之后按字母序加载 overrides目录中的同名文件可用于覆盖内置配置
错误处理
RecipesHelper.tryLoadConfig(recipes/RecipesHelper.scala:95-117)对每个文件单独 try/catch。捕获 Throwable 后调用 FMLCommonHandler.instance().raiseException(e, "<modName> config loading failed in file <path>: <message>", true)(RecipesHelper.scala:107-112),最后一个参数为 true 表示中止游戏。finally 中确保 reader 被关闭。
这意味着 .cfg 语法错误会导致启动失败而非静默跳过,是有意为之的严格策略。
语法
配置与配方共用同一套 DSL,见 配方与配置 DSL。
数值
| 数值名 | 值 |
|---|---|
| 内置配置文件数 | 1(files.lst 仅列出 net-filter.cfg) |
| 用户配置扩展名 | .cfg |
| 用户配置排序方式 | 字母序(configDir.list().sorted) |
| 覆盖目录名 | overrides |
| 配置解析出错的后果 | 中止游戏(raiseException(..., true)) |
| 清单注释前缀 | # |
交互
本条目描述的是管理员/模组作者的配置接口,玩家不直接接触:
| 触发 | 行为 |
|---|---|
| 首次启动 | 自动创建 config/bdlib 目录及 readme.txt、overrides 子目录 |
| 每次启动 | 加载内置配置 → 应用 overrides 覆盖 → 按字母序加载用户 .cfg |
管理员放入 overrides/net-filter.cfg |
该文件完全取代 jar 内的同名内置配置 |
管理员放入 config/bdlib/50-extra.cfg |
在内置配置之后、zzz.cfg 之前加载,可用于追加而非覆盖 |
.cfg 存在语法错误 |
抛错并中止游戏,日志指出出错文件路径 |