2016-08-31 2 views
-4

Im пытается проверить, содержит ли предмет элемента определенную строку.Проверяет, если элемент содержит информацию

Я уже попытался это:

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

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

Помощь в appreaciated ;-)

+1

Можете ли вы напечатать 'LoreInHand' и поделиться им с нами? – Mureinik

ответ

1

То, что я предполагаю, что вы хотите сделать, это проверить каждую строку Lore, если он содержит данную один. Поэтому в основном то, что вам нужно сделать, будет следующее:

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 
      } 
     } 
    } 
} 

, но имейте в виду, что это может запустить ваш код несколько раз, в зависимости от того, сколько раз «уздечка» входит в действительном знания. Вы можете обойти эту проблему, поместив возврат в тело if (пока вы находитесь в методе) или извлеките for-loop в дополнительный метод для повторного использования. В 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 
     } 
    } 
} 

Надеется, что это помогает!


Edit: так getItemInHand() является deprectaed, я обновил свои примеры теперь действительного кода. Также добавлено предложение Krijn Tojets.


Просто была еще одна идея для совместимого метода Java7, который не нуждается для цикла:

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 
    } 
} 
+0

Убедитесь, что 'getItemMeta();' не возвращает null, потому что вы получите NPE строку ниже. –

+0

Благодарим Крийна Тота за упоминание. Добавил его к моему ответу. – Mit0x2

0

Вы также должны добавить нулевой проверки для элемента, и это мета. Если игрок ничего не держит, getItemInHand() вернет значение null. Также, если элемент не имеет мета (не уверен, что это возможно, но такая же ошибка произошла со мной в той же строке)

Смежные вопросы