Вопрос Как можно реализовать список предметов

RpAhmed

Пользователь
Сообщения
17
Как можно реализовать список предметов, которые будут необходимы при крафте?
Кусок кода:
Java:
public static boolean removeMyItems(Player ply, String[] items, int amount)
    {
        for (int i = 1; i < 36; i++) {
            ItemStack item = ply.getInventory().getItem(i);
            if (item == null) continue;
            if (item.isSimilar(new ItemStack(Material.getMaterial(items[i]))) & item.getAmount() >= amount) // getMaterial выдает null т.к не видит такого материала в майне
            {
                item.setAmount(item.getAmount() - amount);
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
Проблема в том, что метод getMaterial() не находит нужные предметы по его названию (метод не видит материалы в пределах майнкрафта).
Так же нашел весь список возможных предметов для использования -
Можно-ли как-то сделать список из типа ItemStack, что-бы реализовать крафт из нескольких предметов?
Что-то типа этого:

Java:
String items[] = {"GUNPOWDER", "REDSTONE", "IRON_INGOT"};
if (Main.removeMyItems(ply, items, 2))
{
    ply.playSound(ply.getLocation(), Sound.BLOCK_ENCHANTMENT_TABLE_USE, 2, 1);
    // тут будет выдаваться предмет
}
 
Решение
Java:
if (item.isSimilar(new ItemStack(Material.getMaterial(items[i]))) & item.getAmount() >= amount) // getMaterial выдает null т.к не видит такого материала в майне
У тебя там null, потому что переменная i в цикле проходится от 0 до 35 и что-то мне подсказывает что твой массив 'items' не содержит 36 элементов. В итоге в середине цикла (или раньше) твой 'items' даёт нулл, этот нулл сьедается методом getMaterial() и выплёвывает тебе в консоль NPE.

Если твой массив String[] items - это лишь список названий материалов, то создавать каждый раз новый ItemStack с каждым из материалов не обязательно. И даже получать материал из названия было не обязательно. Можно было написать что-то вроде:
Java:
List<String> items;

if...
Java:
if (item.isSimilar(new ItemStack(Material.getMaterial(items[i]))) & item.getAmount() >= amount) // getMaterial выдает null т.к не видит такого материала в майне
У тебя там null, потому что переменная i в цикле проходится от 0 до 35 и что-то мне подсказывает что твой массив 'items' не содержит 36 элементов. В итоге в середине цикла (или раньше) твой 'items' даёт нулл, этот нулл сьедается методом getMaterial() и выплёвывает тебе в консоль NPE.

Если твой массив String[] items - это лишь список названий материалов, то создавать каждый раз новый ItemStack с каждым из материалов не обязательно. И даже получать материал из названия было не обязательно. Можно было написать что-то вроде:
Java:
List<String> items;

if (items.contains(item.getType().name()))
 
Последнее редактирование:
У тебя там null, потому что переменная i в цикле проходится от 0 до 35 и что-то мне подсказывает что твой массив 'items' не содержит 36 элементов. В итоге в середине цикла (или раньше) твой 'items' даёт нулл, этот нулл сьедается методом getMaterial() и выплёвывает тебе в консоль NPE.
Как тогда лучше это все реализовать?
Авто объединение сообщений:

Java:
List<String> items;

if (items.contains(item.getType().name())
Понял, принял.
 
Последнее редактирование:
Назад
Сверху Снизу