Minecraft Bukkit插件:右键村民弹自定义GUI后出现原版交易界面如何解决
Minecraft BedWars插件自定义村民商店GUI闪退问题解决方案
问题原因
你遇到的GUI闪退问题根因如下:
- 当前监听器的事件优先级低于服务端原版村民交互逻辑的优先级,即使你调用了
e.setCancelled(true),后续更高优先级的原版事件处理逻辑仍会执行打开原版交易界面的操作,直接覆盖你刚打开的自定义GUI - 部分版本服务端/客户端存在交互预判逻辑,即使服务端取消了交互事件,客户端仍会触发一次GUI打开请求,把你的自定义GUI顶掉
修复方案
- 调整监听器事件优先级为最高级,同时忽略已取消的事件,确保你的取消操作不会被后续逻辑覆盖
- 延迟1游戏tick执行自定义GUI打开操作,避开原版交互逻辑的执行窗口,避免被覆盖
- 可选:初始化村民时调用
villager.setRecipes(new ArrayList<>());清空交易列表,就算出现极端情况原版GUI弹出也不会显示交易内容 - 可选:增加主手点击判断,避免副手交互重复触发事件
修正后的代码示例
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void interactAtEntity(PlayerInteractAtEntityEvent e) { // 只处理主手点击,避免双次触发 if (e.getHand() != EquipmentSlot.HAND) { return; } if (e.getRightClicked() == ShopVillager.villager1) { System.out.println("UwU"); // 提前取消事件阻止原版逻辑执行 e.setCancelled(true); Player player = e.getPlayer(); // 延迟1tick打开GUI,替换下面的plugin为你的插件主类实例 Bukkit.getScheduler().runTaskLater(plugin, () -> { FastShop shop = new FastShop(player); player.openInventory(shop.getInventory()); }, 1L); return; } }
注:代码中的
plugin需要替换为你自己插件的主类实例,确保调度任务正常注册。
内容的提问来源于stack exchange,提问作者Sysy
相关产品推荐
相关产品推荐

