InventoryClickEvent异常:自定义背包右键点击合欢门物品无响应
问题修复说明
你的代码存在以下几处核心问题导致点击物品无响应:
- 事件监听方法缺失
@EventHandler注解:Bukkit事件机制只会识别添加了@EventHandler注解的方法作为事件回调,你写的onInventoryClick没有加该注解,所以点击背包事件触发时根本不会执行你写的逻辑。 - 点击物品获取逻辑错误:
InventoryClickEvent触发时玩家光标上还未持有点击的物品,用p.getItemOnCursor()永远匹配不到目标物品,应该用e.getCurrentItem()获取当前点击的格子内的物品。 - 缺少空校验:直接调用
getItemMeta()、getDisplayName()没有做非空判断,当点击空格子、物品无Meta、物品无自定义名称时会抛出空指针异常导致插件崩溃。 - 没有限定背包范围:没有判断当前点击的是否为你创建的自定义传送菜单,玩家在其他背包内拿到同名物品也会误触发传送逻辑。
- 未取消点击事件:没有取消事件会导致玩家可以将菜单内的合欢门物品拿走,造成非法物品漏洞。
修正后完整代码
package de.Daniel260.startup.items; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class HerrDesWindesTalisman implements Listener{ @EventHandler public void onPlayerInteract (PlayerInteractEvent e) { Player p = e.getPlayer(); Action a = e.getAction(); if(a.equals(Action.RIGHT_CLICK_AIR) || a.equals(Action.RIGHT_CLICK_BLOCK)) { if(e.getItem() != null && e.getItem().getType().equals(Material.TOTEM_OF_UNDYING)) { if(p.hasPermission("quests.herrderwinde")) { p.sendMessage("Warpmenü"); Inventory inv = Bukkit.createInventory(p, 27, "Ziele"); ItemStack item1 = new ItemStack(Material.ACACIA_DOOR); ItemMeta imeta1 = item1.getItemMeta(); imeta1.setDisplayName("Reise nach Irgendwo"); item1.setItemMeta(imeta1); inv.setItem(10, item1); p.openInventory(inv); } else { p.sendMessage("§4Für dieses Item brauchst du folgende Quest: §6Herr des Windes"); } } } } @EventHandler public void onInventoryClick (InventoryClickEvent e) { // 先判断是不是我们的自定义传送菜单 if (!e.getView().getTitle().equals("Ziele")) { return; } // 取消所有菜单内的点击操作,防止物品被拿走 e.setCancelled(true); Player p = (Player) e.getWhoClicked(); ItemStack clickItem = e.getCurrentItem(); // 空校验 if (clickItem == null || clickItem.getType() == Material.AIR || !clickItem.hasItemMeta()) { return; } ItemMeta meta = clickItem.getItemMeta(); if (meta.hasDisplayName() && meta.getDisplayName().equals("Reise nach Irgendwo")) { // 关闭菜单再传送,体验更流畅 p.closeInventory(); Location loc = new Location(p.getWorld(), 0, 6, 0); p.teleport(loc); } } }
内容的提问来源于stack exchange,提问作者Daniel260
相关产品推荐
相关产品推荐

