启动前文件铺设

基本信息

属性 值
入口 EventHandler.preStartGame()(static,由类转换器注入调用)
调用点 DefaultOptionsClassTransformer 注入的 INVOKESTATIC DefaultKeys.preStartGame()V
执行时机 Minecraft.startGame(混淆名 ag)方法体第一行
作用范围 仅客户端(只对 net.minecraft.client.Minecraft 注入)

四条分支

1. options.txt 不存在 → 铺设默认选项

读 config/defaultoptions.txt 写 options.txt,逐行跳过以 key_ 开头的行(EventHandler.java:229-231)。键位由独立的 config/defaultkeys.txt 机制处理,故不在此处下发。

2. optionsof.txt 不存在 → 铺设 OptiFine 选项

读 config/defaultoptionsof.txt 写 optionsof.txt,不过滤任何行(:242-258)。

3. 铺设两份 localconfig 定义文件

若不存在则从 jar 内复制:

目标路径 jar 内来源
config/localconfig.txt /assets/defaultkeys/default-localconfig.txt
config/localconfig-example.txt /assets/defaultkeys/example-localconfig.txt

复制用 IOUtils.copy + try-with-resources(:60-68、:71-79),失败只 printStackTrace,不中断启动。

注意 config/localconfig.txt 在首次启动时会被空模板覆盖创建(因为不存在),打包作者之后往里加的条目才生效。

4. config/modpack-update 存在与否 → 恢复 / 备份

这是整个模组的核心分支(:80-93):

条件 行为
存在 config/modpack-update restoreLocalConfig() → 成功后 Files.delete 删除该文件;失败则保留并记 error(提示"手工删除,否则会一直回滚到这里")
不存在 backupLocalConfig() —— 每次正常启动都把玩家当前配置备份进 localconfig.cfg

即:模组包更新时打包作者在 config/ 放一个空的 modpack-update 文件,玩家下次启动就会把 localconfig.txt 里列出的那些"玩家自定义项"还原成更新前的值,其余配置跟随模组包更新。

涉及的全部文件路径

路径 位置 作用
options.txt 游戏根 Minecraft 主配置(由 config/defaultoptions.txt 生成)
optionsof.txt 游戏根 OptiFine 配置(由 config/defaultoptionsof.txt 生成)
config/defaultoptions.txt config 打包作者下发的默认选项模板
config/defaultoptionsof.txt config 打包作者下发的默认 OptiFine 模板
config/defaultkeys.txt config 打包作者下发的默认键位
config/localconfig.txt config 声明"哪些配置项要保护玩家本地修改"
config/localconfig-example.txt config 常见 mod 的现成预设(首次启动自动生成)
config/modpack-update config 哨兵文件,存在即触发恢复
localconfig.cfg 游戏根 玩家本地值快照,自动生成,勿手改
knownkeys.txt 游戏根 已下发过的键位记录

⚠️ 注意 localconfig.cfg 与 knownkeys.txt 在游戏根目录而非 config/ 下(EventHandler.java:102、:157、:373),容易与直觉不符。

限制

  • 全部为无条件覆盖式逻辑,没有任何"仅首次"的守卫;options.txt 是否存在是唯一判据。
  • 三处 IOException 分支只 printStackTrace 或记 error,从不阻止游戏启动——配置失败会静默继续。
  • 备份 localconfig.cfg 每次启动都重写(PrintWriter 截断),内容完全由当前 config/ 下实际文件解析而来。

相关条目