激活物品热键(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 时生效,其他容器(如机器内部槽位、附魔台)不触发。

相关条目