打开界面热键
TaskNH 只注册 1 个按键绑定,没有第二个。
完整定义
proxy/ClientProxy.java:
public static final KeyBinding KEY_OPEN_GUI = new KeyBinding(
"key.tasknh.open",
Keyboard.KEY_Y,
"key.categories.tasknh");
| 项 | 值 |
|---|---|
| 字段名 | KEY_OPEN_GUI(public static final) |
| 类型 | net.minecraft.client.settings.KeyBinding |
| 翻译键 | key.tasknh.open → en_US.lang 中为 “Open TaskNH” |
| 默认键 | Keyboard.KEY_Y —— 即键盘 Y |
| 按键分类 | key.categories.tasknh → “TaskNH”(在 Forge 按键设置里单独成一类) |
| 修饰键 | 无(构造器只传两个参数,没有 Ctrl/Shift/Alt 组合) |
注册发生在 ClientProxy.init():ClientRegistry.registerKeyBinding(KEY_OPEN_GUI);
行为
ClientProxy.onClientTick(TickEvent.ClientTickEvent),注册在 FML 总线,只处理 phase == END:
if (KEY_OPEN_GUI.isPressed()) { TaskNHGui.open(); }
TaskNHGui.tick();
每 tick 末尾检测一次,按下即调 TaskNHGui.open()(开一个空的 TaskNHGuiData,不选中任何任务)。TaskNHGui.open() 只是把数据存进 pendingOpen,真正构建界面由紧随其后的 TaskNHGui.tick() 完成,见 主界面 GUI。
松开/长按不会重复触发——KeyBinding.isPressed() 在 1.7.10 中只在该键本 tick 刚被按下时为真。
⚠️ 这个热键是纯客户端的:open() 不发任何封包,界面完全由本地缓存构建。在主菜单(未进世界)时按下不会有任何效果,因为 TaskNHGui 的构建依赖 TaskNHClientCache,而后者只在收到服务端同步后才有数据。
与命令的关系
除热键外,GUI 还能由服务端通过封包打开,见 网络协议 的 OpenGuiPacket:/tasknh gui 发无 taskId 版本,/tasknh open <taskId> 发带 taskId 版本。这两条需要 tasknh.gui / tasknh.open 权限,而热键不需要任何权限——客户端行为,无法被权限门控。
没有其他热键
grep -rnE "KeyBinding|KeyMapping|registerKey" --include=*.java src/ 在 ClientProxy.java 中只有 3 处命中:第 3 行 import、第 26 行 new KeyBinding、第 42 行 ClientRegistry.registerKeyBinding。仓库内没有 registerKeyMappings(1.19+ 风格),也没有 InputEvent 处理。
不过界面上还有几个不属于 TaskNH 的键:IconSlotWidget 的注释写明「With NEI installed, left-click opens the item’s recipes and the R and U hotkeys work over the slot」——这里的 R 与 U 是 NEI 自己的热键(配方/用法查询),TaskNH 只是让该槽位对 NEI 的悬停物品解析可见(mouseOver 处注释:「Lets NEI resolve the hovered item, so its R and U hotkeys work over this slot.」),从而把这两个键让渡给 NEI。此外还有 NEI 拖放的左/中/右键(见 主界面 GUI 的槽位交互约定)与 HUD 设置界面的 ESC 关闭(原生 GuiScreen 行为)。这些都不出现在 Forge 按键设置界面里,也不在 TaskNH 的控制之下。