打开时装物品栏热键
基本信息
| 属性 | 值 |
|---|---|
| 字段名 | 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自行解决。