MC 1.19.2:如何监听玩家配方书操作以同步全局库存?
配方书Shift点击操作的监听方案(全局库存同步场景)
常规的InventoryClickEvent无法捕获配方书内的Shift点击操作,因为这类操作是客户端直接请求合成并将物品写入背包,绕过了常规的背包点击事件逻辑。以下是两种可行的监听方案:
1. 高版本直接监听PlayerRecipeClickEvent(Spigot/Paper 1.19+)
从Minecraft 1.19起,Spigot/Paper新增了PlayerRecipeClickEvent,专门用于捕获配方书内的所有交互操作,包括Shift点击。直接监听该事件即可处理同步需求:
@EventHandler public void onRecipeShiftClick(PlayerRecipeClickEvent event) { if (event.isShiftClick()) { Player player = event.getPlayer(); InvUpdate = true; invupdateplayer = player; } }
注意:此方案仅适用于支持该事件的Spigot/Paper版本,需确保服务器版本符合要求。
2. 低版本兼容方案(1.18及以下)
若服务器版本低于1.19,无PlayerRecipeClickEvent,可通过监听InventoryUpdateEvent捕获背包内容变化——配方书Shift合成的物品会直接进入玩家背包,触发该事件:
@EventHandler public void onInventoryUpdate(InventoryUpdateEvent event) { Inventory inv = event.getInventory(); if (inv instanceof PlayerInventory) { Player player = ((PlayerInventory) inv).getHolder(); // 若需精准过滤配方书操作,可结合NMS监听RecipeBook相关数据包(复杂度较高) InvUpdate = true; invupdateplayer = player; } }
此方案会捕获所有背包内容变更场景,若需仅针对配方书操作,可额外添加逻辑判断,或使用NMS监听PacketPlayInRecipeBookClick数据包(需处理版本兼容问题)。
注意事项
- 确保事件监听器已正确注册至插件主类。
- 使用
PlayerRecipeClickEvent时,建议在plugin.yml中声明对应版本依赖,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Hexanilix
相关产品推荐
相关产品推荐

