Default Configs
[!INFO] Git Commit:
b897125| Updated: 2026-10-01
Default Configs(modid defaultkeys,显示名 “Default Configs”)是 Minecraft 1.7.10 上的一个纯客户端 core mod,原作者 BlayTheNinth,GTNH 维护。它让整合包可以下发默认设置,而不必在包里塞一个 options.txt。
它做三件事:把打包作者预设的选项铺进 options.txt / optionsof.txt;把预设的键位写进每个 KeyBinding 的默认值且不覆盖玩家后续修改;以及在整合包更新时,用 localconfig.txt 声明的清单保护玩家本地自行改过的配置项不被覆盖。
它不注册任何方块、物品、实体、GUI、网络包。 全部功能靠一个类转换器 + 一个 Access Transformer + 一个客户端指令实现。
核心结论
| 问题 | 答案 |
|---|---|
| 它注册了什么方块 | 没有任何方块 |
| 它注册了什么实体 / TileEntity | 没有 |
| 它注册了几个物品 | 0 个(GameRegistry.register 全仓 0 处) |
| 它有自己的 GUI 吗 | 没有(不实现 IGuiHandler) |
| 它有热键吗 | 不注册任何 KeyBinding(new KeyBinding 全仓 0 处),但改写所有 KeyBinding 的默认值 |
| 它有自己的网络包吗 | 没有 |
| 它有指令吗 | 有 1 个:/defaultconfigs(客户端,权限 0) |
| 它是 core mod 吗 | 是(coreModClass = coremod.DefaultOptionsLoadingPlugin) |
| 它有 AT 吗 | 有 1 条(KeyBinding.keyCodeDefault → public) |
| 它用 Mixin 吗 | 否(usesMixins = false) |
| Java 文件数 | 9 |
modid 实读
DefaultKeys.java:20:public static final String MOD_ID = "defaultkeys";,用于 @Mod(modid = DefaultKeys.MOD_ID)(:15)。
⚠️ 命名陷阱:modid 是
defaultkeys,不是分类名default-configs,也不是显示名 “Default Configs”。
它是 core mod(易被误判)
gradle.properties 中 coreModClass = coremod.DefaultOptionsLoadingPlugin,该类实现 IFMLLoadingPlugin,向 Minecraft 类的 startGame(混淆名 ag)方法体开头注入 DefaultKeys.preStartGame()。
之所以必须用 core mod:preStartGame 需要在客户端启动游戏前完成文件铺设,此时 FML 生命周期事件已经太晚(options.txt 已被 GameSettings 读入)。
依赖
| 模组 | 强度 | 说明 |
|---|---|---|
| OptiFine | 可选 | FMLClientHandler.instance().hasOptifine() 决定是否处理 optionsof.txt |
| NotEnoughItems 等 | 无关 | 本模组不与任何内容 mod 交互,只按文件名解析它们的配置 |
@Mod 声明 acceptableRemoteVersions = "*"(DefaultKeys.java:13)——必须装在客户端,服务端可无。
工作流程
[Minecraft.startGame 入口,core mod 注入]
└─ DefaultKeys.preStartGame()
├─ options.txt 不存在? → 用 config/defaultoptions.txt 生成(跳过 key_ 行)
├─ optionsof.txt 不存在? → 用 config/defaultoptionsof.txt 生成
├─ config/localconfig.txt 不存在? → 从 jar 复制默认模板
├─ config/localconfig-example.txt 不存在?→ 从 jar 复制预设示例
└─ config/modpack-update 存在?
├─ 是 → restoreLocalConfig() 还原玩家本地值 → 成功后删除哨兵
└─ 否 → backupLocalConfig() 备份当前值到 localconfig.cfg
[主菜单首次打开,GuiOpenEvent]
└─ reloadDefaultMappings()
读 config/defaultkeys.txt → 写 KeyBinding.keyCodeDefault(依赖 AT)
用 knownkeys.txt 保证每个键位只被下发一次
物品列表
无。
物品效果
无。
游戏设定
- 启动前文件铺设 -
preStartGame的四条分支与全部涉及的文件路径 - 默认键位下发 -
defaultkeys.txt+knownkeys.txt的"只下发一次"机制 - localconfig 保护机制 - 整合包更新时保护玩家本地配置的两阶段模型
- localconfig 条目语法 -
FILE/CATEGORY/TYPE:NAME语法、通配与否定规则 - 三种格式处理器 -
forge/simple/ini三套文本解析
指令
- /defaultconfigs -
saveAll|saveKeys|saveOptions|createUpdateFile,客户端指令,权限等级 0
本 mod 没有的内容(附 grep 证据)
没有方块、物品、实体
$ grep -rn "registerBlock\|GameRegistry.register\|registerTileEntity\|EntityRegistry" src/main/java
(无输出)
没有自己的 GUI
$ grep -rn "IGuiHandler\|registerGuiHandler" src/main/java
(无输出)
不注册热键、不注册网络包
$ grep -rn "new KeyBinding" src/main/java
(无输出)
$ grep -rn "IMessage\|NetworkRegistry\|newSimpleChannel" src/main/java
(无输出)
注意:它改写别人的
KeyBinding,与注册自己的KeyBinding是两回事。
没有世界生成、实体事件、附魔、药水、成就
$ for kw in registerWorldGenerator EntityLiving onPlayerLogin TickEvent Enchantment Potion Achievement; do ... done
每一个都是 0
不使用 Mixin
gradle.properties:usesMixins = false。低层改写靠 core mod 类转换器 + AT,不是 Mixin。
源码缺陷
-
/defaultconfigs createUpdateFile的路径与检测端不一致(实质 bug):- 创建:
CommandDefaultOptions.java:36→<游戏根>/modpack-update - 检测:
EventHandler.java:80→<游戏根>/config/modpack-update
两者不是同一路径,因此该指令生成的哨兵文件永远不会被识别,保护恢复流程无法由指令触发。lang 文案(
en_US.lang:2)“created inside the config directory” 证明本意是config/,即创建端写错了路径。 - 创建:
-
localconfig.cfg与knownkeys.txt落在游戏根目录(EventHandler.java:102、:157、:373),而非config/下。与同类的config/defaultkeys.txt、config/localconfig.txt混放两种约定,极易误删或被整合包清理脚本扫掉。 -
备份与恢复不对称——
restoreLocalConfig()依赖config/localconfig.txt存在才开始(:158);若该文件被删,哨兵文件仍会被删除(:84),这次更新的一次恢复机会被白白消耗且无法重试。 -
恢复失败仍删哨兵——
restoreLocalConfig()的true只代表流程走完,不代表每条成功。Files.delete无条件执行(:84),中途失败后玩家配置可能处于部分还原状态且无法再次触发。 -
同文件混用格式按首条处理——分派用
first.getFormat(),混用条目静默失配。 -
同组内首个匹配即 break——三个 handler 都是
for (j...)命中即break,重叠的通配条目只有第一条生效,顺序敏感且无告警。 -
列表恢复会重排排版——
ForgeConfigHandler.restore用固定 4 空格缩进重建列表块,丢弃原文件排版,使 diff 变脏。 -
异常处理一律不阻断启动——三处
IOException只printStackTrace或记 error,配置失败时游戏照常启动,玩家不易察觉。 -
knownKeys按键位描述去重,不区分来源 mod——两个 mod 若使用相同 lang key 描述,会被当作同一个键位处理。 -
键位描述改名会静默失效——
defaultKeys.containsKey(...)为 false 时无任何日志(EventHandler.java:362)。 -
指令权限等级为 0——多人服务器上任何玩家都能执行
saveAll覆盖打包作者下发的默认配置。 -
仅英文本地化——只有
assets/defaultkeys/lang/en_US.lang,6 个消息 key,无zh_CN.lang。
相关条目
- Core Mod 类转换器 - 本模组能工作的前提
- Access Transformer -
keyCodeDefault可写的前提 - localconfig 保护机制 - 本分类的核心价值