打开时装物品栏热键

基本信息

属性 值
字段名 KeyHandler.keyOpenCosArmorInventory
语言键 cos.key.openCosArmorInventory
英文名 Open Cosmetic Armor Inventory
中文名 打开时装物品栏
默认按键 Keyboard.KEY_NONE(值为 0,即默认未绑定)
分类 key.categories.inventory(原版「物品栏」分类)
注册 ClientRegistry.registerKeyBinding(keyOpenCosArmorInventory)(在 KeyHandler 构造函数中)
副作用 纯客户端,无权限等级,不消耗任何物品

功能

按下该键 → 客户端发 PacketOpenCosArmorInventory → 服务端 player.openGui(instance, 1, ...) 打开成品界面(GUI ID 1,见 界面与按钮)。

注册路径

KeyHandler 不在 @Mod 主类的 init() 里实例化,而是在客户端代理的初始化中完成(InventoryManagerClient.init()):

FMLCommonHandler.instance().bus()
    .register(CosmeticArmorReworked.keyHandler = new KeyHandler());

因此 CosmeticArmorReworked.keyHandler 这个 @SideOnly(Side.CLIENT) 静态字段在专用服务端上永远为 null——任何直接访问它的代码都必须保证只在客户端执行。

两处消费点

位置 事件 / 方法 行为
KeyHandler.handleEvent(InputEvent.KeyInputEvent) @SubscribeEvent,注册在 FML 总线 keyOpenCosArmorInventory.isPressed() → network.sendToServer(new PacketOpenCosArmorInventory())
GuiCosArmorInventory.keyTyped(char, int) 覆写 GuiContainer#keyTyped if (par2 == keyOpenCosArmorInventory.getKeyCode()) mc.thePlayer.closeScreen();,即在成品界面内再按一次该键关闭界面

行为注意点

  • 默认未绑定。Keyboard.KEY_NONE 在 LWJGL 中是 0,玩家必须自己在「选项 → 控制」里给 cos.key.openCosArmorInventory 绑键,否则该功能完全不可达(成品界面仍可通过按钮 76 从原版背包进入)。
  • 未绑定时的副作用:keyTyped() 把 par2 与 getKeyCode()(此时为 0)直接比较,且这个分支在 super.keyTyped() 之前。任何键位码为 0 的按键(如部分小键盘按键)在成品界面内会被当作「关闭」,而不会传给 super。绑定正常按键后此问题消失。
  • 该热键在任何界面、任何世界都生效,KeyInputEvent 不做 mc.currentScreen == null 之类的判断——在成品界面内按下即为「关闭」,在原版背包界面内按下则是向服务端请求打开成品界面。
  • 与其他 mod 无按键冲突处理逻辑;冲突由原版 options.txt 的 key.cos.key.openCosArmorInventory 自行解决。

相关条目