配置加载机制

基本信息

属性 值
配置目录 <游戏目录>/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)严格按以下顺序处理:

  1. 读取内置清单 — 以 listResource 打开 jar 内的清单文件(本模组为 /assets/bdlib/config/files.lst),逐行读取并过滤掉以 # 开头的注释行与空行。
  2. 逐个处理内置文件 — 对清单中每个文件名,先检查 <configDir>/overrides/<文件名> 是否存在(RecipesHelper.scala:54-55):
    • 存在 → 读覆盖文件,日志路径为该文件的 getCanonicalPath
    • 不存在 → 读 jar 内的 resBaseName + 文件名,日志路径为该资源的 URL
    • 若 overrides 目录不存在则先 mkdir() 创建。
  3. 加载用户配置 — 遍历 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 存在语法错误 抛错并中止游戏,日志指出出错文件路径

相关条目