You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:00