Checks if an item contains information

时间:2016-08-31 17:30:10

标签: java minecraft bukkit

Im trying to check if the lore of an item contains a specific string.

I already tried this:

if (p.getItemInHand().getItemMeta().getLore() != null) {
     List<String> LoreInHand = p.getItemInHand().getItemMeta().getLore();

     if (LoreInHand.contains("lore")){
         //do stuff
     }
}

Help is appreaciated ;-)

2 个答案:

答案 0 :(得分:1)

我猜你想要做的是检查每个传说字符串是否包含给定的字符串。 所以基本上你需要做的是:

ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
if (itemInMainHand != null && itemInMainHand.hasItemMeta()) {
    ItemMeta metaOfItemInHand = itemInMainHand.getItemMeta();
    if (metaOfItemInHand.hasLore()) {
        List<String> loreInHand = metaOfItemInHand.getLore();

        for(String loreLine : loreInHand) {
            if(loreLine.contains("lore") {
                //do stuff
            }
        }
    }
}

但请记住,这可能会多次运行您的代码,具体取决于实际知识中包含多少次'lore'。你可以通过在if体中放置一个返回来解决这个问题(只要你在方法中)或者将for循环提取到一个额外的方法以获得可重用性。 在Java8中,您可以使用流做一些事情:

ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
if (itemInMainHand != null && itemInMainHand.hasItemMeta()) {
    ItemMeta metaOfItemInHand = itemInMainHand.getItemMeta();
    if (metaOfItemInHand.hasLore()) {
        List<String> loreInHand = metaOfItemInHand.getLore();

        if(!loreInHand.stream().filter(s -> s.contains("lore"))
           .collect(Collectors.toList()).isEmpty()) {
            //do stuff
        }
    }
}

希望这有帮助!

编辑:,因为getItemInHand()已被删除,我将我的示例更新为现在有效的代码。还添加了Krijn Tojets建议。

对于Java7兼容方法有另一个想法,它不需要for循环:

ItemStack itemInMainHand = player.getInventory().getItemInMainHand();
if (itemInMainHand != null && itemInMainHand.hasItemMeta()) {
    ItemMeta metaOfItemInHand = itemInMainHand.getItemMeta();
    if (metaOfItemInHand.hasLore() && 
         String.join(" ", metaOfItemInHand.getLore()).contains("lore")) {
        //do stuff
    }
}

答案 1 :(得分:0)

您还应该为项目及其元素添加空检查。如果玩家没有任何东西,getItemInHand()将返回null。此外,如果该项目没有meta (不确定这是否可行,但我在同一行上发生了同样的错误)