激活物品热键(Activate item in inventory)
基本信息
| 属性 | 值 |
|---|---|
| 类型 | net.minecraft.client.settings.KeyBinding |
| 声明位置 | handlers/KeyboardEventHandler.java:26(构造函数内) |
| 注册位置 | handlers/KeyboardEventHandler.java:27 ClientRegistry.registerKeyBinding |
| 显示名 | "Activate item in inventory" |
| 默认按键 | Keyboard.KEY_G(org.lwjgl.input.Keyboard) |
| 分类 | "Miscellaneous" |
| 触发场景 | 仅在容器 GUI(GuiContainer)打开时 |
行为
热键本身不做任何事。它只在 IContainerInputHandler.lastKeyTyped 里被读取比对,真正干活的是 NEI 的输入分发链:
lastKeyTyped(gui, keyChar, keyID)
├─ keyCode != 0 && keyCode == keyID ? 否则 return false
├─ GuiContainerManager.getSlotMouseOver(gui) == null ? return false
├─ slotIdx = slot.getSlotIndex()
├─ slotIdx < 0 || slotIdx > 35 ? return false ← 越界直接放弃
├─ slot.inventory != player.inventory ? 跳过
└─ stack.getItem() instanceof ActivatableFromInventoryServerSide ?
发 ActivateItemRequest(slotIdx) 并 return true
注意 keyCode != 0 这个判断:玩家在选项里把该键位清空(设为 NONE,getKeyCode() 返回 0)时,整个分支短路,热键静默失效。
限制
-
槽位索引硬限制在 0–35(
KeyboardEventHandler.java:52)。0–8 是快捷栏,9–35 是背包三行主格,36 及以上被拒绝。 -
源码在第 50–51 行留下注释说明原因并标了 TODO:
// for some reason when player in creative mode slots on hotbar have 36+ indices // TODO handle this case
即创造模式下快捷栏槽位索引会变成 36+,此模组直接不响应。这是未修复的已知缺陷。
-
只在
slot.inventory == player.inventory时生效,其他容器(如机器内部槽位、附魔台)不触发。
相关条目
- NEI 输入处理器注册 - 热键所在的 NEI 分发链
- ActivatableFromInventoryServerSide API - 热键能触发的物品条件
- ActivateItemRequest 网络包 - 热键按下后发出的唯一消息