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 保证每个键位只被下发一次

物品列表

无。

物品效果

无。

游戏设定

指令

  • /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。

源码缺陷

  1. /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/,即创建端写错了路径。

  2. localconfig.cfg 与 knownkeys.txt 落在游戏根目录(EventHandler.java:102、:157、:373),而非 config/ 下。与同类的 config/defaultkeys.txt、config/localconfig.txt 混放两种约定,极易误删或被整合包清理脚本扫掉。

  3. 备份与恢复不对称——restoreLocalConfig() 依赖 config/localconfig.txt 存在才开始(:158);若该文件被删,哨兵文件仍会被删除(:84),这次更新的一次恢复机会被白白消耗且无法重试。

  4. 恢复失败仍删哨兵——restoreLocalConfig() 的 true 只代表流程走完,不代表每条成功。Files.delete 无条件执行(:84),中途失败后玩家配置可能处于部分还原状态且无法再次触发。

  5. 同文件混用格式按首条处理——分派用 first.getFormat(),混用条目静默失配。

  6. 同组内首个匹配即 break——三个 handler 都是 for (j...) 命中即 break,重叠的通配条目只有第一条生效,顺序敏感且无告警。

  7. 列表恢复会重排排版——ForgeConfigHandler.restore 用固定 4 空格缩进重建列表块,丢弃原文件排版,使 diff 变脏。

  8. 异常处理一律不阻断启动——三处 IOException 只 printStackTrace 或记 error,配置失败时游戏照常启动,玩家不易察觉。

  9. knownKeys 按键位描述去重,不区分来源 mod——两个 mod 若使用相同 lang key 描述,会被当作同一个键位处理。

  10. 键位描述改名会静默失效——defaultKeys.containsKey(...) 为 false 时无任何日志(EventHandler.java:362)。

  11. 指令权限等级为 0——多人服务器上任何玩家都能执行 saveAll 覆盖打包作者下发的默认配置。

  12. 仅英文本地化——只有 assets/defaultkeys/lang/en_US.lang,6 个消息 key,无 zh_CN.lang。

相关条目