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 ;-)
答案 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 (不确定这是否可行,但我在同一行上发生了同样的错误)