重载配置热键

基本信息

属性 值
源码位置 GuiCustom.updateScreen(GuiCustom.java:458-464)
触发条件 同时按住 LWJGL 键码 29 与 19
附加条件 再按住键码 42 时同时刷新游戏资源
类别 无(不走 KeyBinding 系统)
作用范围 所有 CMM 自定义界面(updateScreen 在每个 GuiCustom 上都会跑)

⚠️ 本 mod 没有任何 KeyBinding 注册(grep -rn "KeyBinding" src/ → 0 命中)。热键是直接轮询 org.lwjgl.input.Keyboard.isKeyDown(int) 实现的裸键码判断,不出现在 Minecraft 的「选项 → 控制 → 按键设置」列表里,也无法自定义。源码只写了裸数字键码,没有 Keyboard.KEY_LCONTROL 这类常量引用,所以可读性较差。

键码

LWJGL 键码 源码 用途
29 GuiCustom.java:458 主触发键之一
19 GuiCustom.java:458 主触发键之二
42 GuiCustom.java:460 可选:同时 mc.refreshResources()

键码 42 对应 LWJGL 2 的 KEY_LSHIFT(左 Shift),这点在 重载配置(refresh) 里有交叉印证(ActionRefresh.java:15 同样用 isKeyDown(42) 表示"按住左 Shift")。29 / 19 的常量名源码未给出,此处只如实记录数值。

执行内容

if (Keyboard.isKeyDown(29) && Keyboard.isKeyDown(19)) {
    CustomMainMenu.INSTANCE.reload();
    if (Keyboard.isKeyDown(42)) {
        this.mc.refreshResources();
    }
    this.mc.displayGuiScreen(new GuiMainMenu());
}

与 重载配置(refresh) 动作逐行等价,只差触发方式:动作是点击瞬间执行一次,这个热键是每 tick 轮询。

⚠️ 已知问题:无边沿检测

轮询写法没有"刚按下"的边沿判断(没比较上一 tick 的按键状态),所以:

现象 后果
按住 Ctrl+Shift 持续 1 秒(20 tick) 完整重载 20 次,每次重读磁盘上所有 JSON
按住期间界面闪烁 每次都 displayGuiScreen(new GuiMainMenu())
按住时改配置 会有中间态被加载(Config 表与 CMMEventHandler.actualGui 字段在重载过程中非原子)
按住 Shift 的瞬间 触发 refreshResources(),同样每 tick 一次

即:这是一个"按住即狂刷"的实现,短按(< 1 tick 内松手)可能一次都不触发。

与 ESC 的对比

GuiCustom 同时覆盖了 keyTyped(GuiCustom.java:76-80),只处理 keyCode == 1(ESC)→ displayGuiScreen(null)。⚠️ 因为覆盖了原版 GuiMainMenu.keyTyped,退格键退出游戏的原版行为在自定义界面上失效(需走 退出游戏(quit) 按钮)。

相关条目