重载配置热键
基本信息
| 属性 | 值 |
|---|---|
| 源码位置 | 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) 按钮)。
相关条目
- 重载配置(refresh) - 等价的按钮动作
- 重载与错误处理 - 重载逻辑与失败回滚
- 退出游戏(quit) - 替代了原版的退格退出