Чего человека мучать? Вот тебе код.
Java:
public static void removeItemsExact(PlayerInventory inv, Material itemToRemove, List<String> lore, int minCount, int maxCount) {
for(ItemStack item : inv.getStorageContents()) {
if(item != null) {
if(item.getType() != itemToRemove) continue;
if(item.getAmount() < minCount || item.getAmount() > maxCount) continue;
ItemMeta meta = item.getItemMeta();
boolean argHasLore = lore != null && !lore.isEmpty();
boolean itemHasLore = meta.hasLore();
if(!argHasLore && !itemHasLore) {
item.setAmount(0);
continue;
}
if(lore.size() != meta.getLore().size()) continue;
for(int i = 0; i < lore.size(); i++) {
if(!meta.getLore().get(i).equals(lore.get(i))) continue;
}
item.setAmount(0);
}
}
}
По аргументам понятно. inv - сюда передаешь инвентарь (в моем случае игрока, изменишь если что); itemToRemove - материал предметов, которые надо убирать; lore - лор предмета (предмет будет убираться только если поданный сюда лор полностью соответствует лору предмета); minCount и maxCount - минимальное и максимальное количество предметов.
Вот пример использования:
Java:
List<String> lore = new ArrayList<String>();
lore.add("lore1");
lore.add("lore2");
InventoryHelper.removeItemsExact(e.getPlayer().getInventory(), Material.EMERALD, lore, 4, 10);
В таком случае будут удаляться все эмеральды в количестве от 4 до 10 с определенным лором (в первой строке - lore1, во второй - lore2).
Честно, не проверял на NullPointerException'ы, так что потесть немного добавляя и убираю лоры из аргумента или с самих айтемов в инвентаре.
P.S. Надеюсь, это именно тот код, который тебе был нужен)