java - 如何获取库存中单击的项目的名称

标签 java minecraft bukkit inventory

因此,我需要使用 InventoryClickEvent 事件获取自定义库存中的自定义商品的名称。我尝试获取 Item Meta,但它返回 NullPointerException。因此,我做了一些 if 语句来处理没有 Meta 的单击的项目,并且触发了 If 语句。因此,即使该元素有背景知识和显示名称,也没有元素元。请注意,我不太处理库存,所以我对它有点陌生。另外,我正在另一个类中设置具有显示名称和知识的项目元,但我认为这不会影响任何内容。这是我的 InventoryClickEvent 类的代码。

public class clickEvent implements Listener
{
    private Files files = new Files();
    private KitPvP kit = KitPvP.getInstance();
    private Kit kits = new Kit();
    private InvUtils invUtils = new InvUtils();

    @EventHandler
    public void onInventoryClick(InventoryClickEvent e)
    {
        HumanEntity player = e.getWhoClicked();

        Inventory inv = e.getClickedInventory();
        ItemStack item = e.getCurrentItem();

        if (player instanceof Player)
        {
            if (inv != null && inv.getContents() != null && !inv.getContents().equals(Material.AIR) && inv.getName() != null && !inv.getName().equalsIgnoreCase(""))
            {
                String name = ChatColor.stripColor(inv.getName());

                if (name.equalsIgnoreCase("Kits: ") || name.equalsIgnoreCase("Kits:"))
                {
                    try
                    {
                        if (!kit.getDataFolder().exists())
                        {
                            kit.getDataFolder().mkdirs();
                        }

                        File kFolder = files.getFolder("Kits");
                        if (!kFolder.exists())
                        {
                            files.createFolder("Kits");
                        }

                        File menu = files.getFolder("GUI Menu");
                        if (!menu.exists())
                        {
                            files.createFolder("GUI Menu");
                        }
                        if (!e.getCursor().hasItemMeta())
                        {
                            Logger.log("Clicked Item does not have Item Meta!");
                            return;
                        }

                        if (!e.getCursor().getItemMeta().hasDisplayName())
                        {
                            Logger.log("Clicked Item does not have Display Name!");
                            return;
                        }
                        String check1Name = ChatColor.stripColor(e.getCursor().getItemMeta().getDisplayName());
                        String check2Name = check1Name.replace(" Kit", "");
                        File gItem = files.getGuiItem(check2Name);

                        if (!gItem.exists())
                        {
                            Logger.log("Cannot find required Files!");
                            return;
                        }
                        String itemName = gItem.getName();

                        if (itemName.equalsIgnoreCase(check2Name))
                        {
                            kits.equipKit(player, itemName);
                            e.setCancelled(true);
                        }
                    } catch (Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }

        }
    }
}

最佳答案

理解你的问题有点困难,因为它需要信息,但就这样。

1) 我认为您使用事件来传递项目等,因此 e.getCursor() 解析为 Item。您确定检索到的对象在创建、捆绑在事件中并传递时包含元吗?我的第一个任务是检查事件的发射器是否正在创建正确的信息。

2) 在第一个 if 子句之前执行 e.getCurrentItem();。这有点令人困惑,因为返回对象似乎是一个 ItemStack。您的命名约定应该重新审视。其余代码也是如此。 ItemStack 对象持有什么?为什么不能从那里检索有问题的项目?

3) 正如 #1 中提到的,检查事件的发射器正在做什么。很可能 ItemMeta 因此未发送。

还有一个快速提示。避免这样的长方法体。尝试将您的问题分解为更小的问题。这将使调试和维护过程变得更加容易。最后避免按照您现在的方式对常量进行 String 相等性检查。而不是 someVar.equals("someConstant") 由于“someConstant”.equals(someVar)。这是避免 NPE 的一个非常好的技巧。

关于java - 如何获取库存中单击的项目的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48955430/

相关文章:

java - 如何通过属性使用流来过滤对象?

java - 通过 JMS 或 JavaSpaces 分配多阶段任务有哪些优点/缺点?

java - Java 如何处理在 for 循环中使用 getter 的情况?

java - Bukkit插件: Blank sign

java - 如何保护客户端反作弊

gradle - 《我的世界》伪造gradle “runClient”异常

java - 使用 charAt 时出现字符串 outOfBoundsException

Java - SQL 和线程 - 处理卡住

java - 使用命令更改标志的内容

java - 继承的空指针异常 (Java)