0

我正在制作一个带有标志商店的 bukkit 插件,它会打开一个静态库存,您可以点击获取工具包。我已经设置了库存,单击标志时它会打开,并且我想要的物品在那里。但是,当我单击库存时,第一个 if 语句返回 false。这是我的代码:

@EventHandler
    public void onInventoryClick(InventoryClickEvent e){
        if (e.getInventory() == kitInvent){
            Player player = (Player) e.getWhoClicked();
            player.sendMessage("Kit Shop Opened");

            if (e.getCurrentItem().getItemMeta().getDisplayName() == ChatColor.DARK_PURPLE + "Grenadier Kit"){
                e.setCancelled(true);
                player.getInventory().clear();
                Potion potion = new Potion(PotionType.INSTANT_DAMAGE, 1);
                potion.setSplash(true);
                ItemStack grenadeStack = new ItemStack(Material.POTION, 32);


                potion.apply(grenadeStack);
                player.getInventory().addItem(grenadeStack);
            }
        }
    }

它无法通过“if (e.getInventory() == kitInvent)”部分,因为当我将其注释掉时,它会发送消息“Kit Shop Opened”。

另外,我是否正确地执行了下一个 if 语句,它在哪里检查项目的标题?我在那里也遇到了问题,但我不知道这是否仅仅是因为前面的 if 语句。

任何帮助是极大的赞赏!

4

3 回答 3

2

打开的库存永远不会真正等于库存“kitInvent”,因为 == 检查名称以外的其他内容,里面的物品。有很多方法可以检查库存是否与 kitInvent 相同。(与您想要做的“相同” ,检查玩家是否在正确的库存中)

检查库存是否是您想要的一种方法是检查库存名称是否相同。虽然这是一般检查,但您也可以检查库存中的项目和项目名称——但坚持名称就足够了。(特别是如果你使用 ChatColors,因为箱子可以重命名!)另外,对于额外的检查,使用 equalsIgnoreCase()。

if(e.getInventory().getName().equalsIgnoreCase(kitInvent.getName()))

最后,从这个线程中引用的关于 == vs .equals()的引用告诉你,如果你只想检查一件事,那么 equals() 是要走的路,别无其他。

equals 只会比较它写来比较的内容,不多也不少。

祝你顺利通过你的项目。

于 2016-11-17T02:32:23.083 回答
0

您应该使用if (e.getInventory().equals(kitInvent))而不是 ==。.equals 寻找相同的值而不是参考。

至于下一个 if 语句,我还建议使用 .equals,因为在比较字符串时使用 == 被认为是不好的编码习惯。

于 2013-08-28T16:26:41.530 回答
0

if(e.getInventory().getName().equalsIgnoreCase("the name of the inventory you want to do stuff with")) 如果清单的名称等于事件清单的名称,您可以这样做将返回 true !

于 2015-09-15T21:19:57.773 回答