Войти или зарегистрироваться

Помогите Как сделать проверку на предмет в инвенторе?

  • Автор темы Автор темы JayRoon
  • Дата начала Дата начала

JayRoon

Участник
Заблокирован
Пользователь
Баллы
31
Имя в Minecraft
Krongss_FUR
Здравствуйте, проблема в том, что мне надо проверять у игрока в инвенторе наличие пщеницы, но не обычной, а с своим именем и лором(кастомная дата тоже стоит). Но есть и проблемы, какие образом это сделать? Первый вариант:
Код:
for(ItemStack itemed : player.getinventory().getContents()) {
    ItemStack item = new ItemStack(Material.WHEAT, 1);
    ItemMeta meta = item.getItemMeta();
    meta.setDisplayName(ChatColor.DARK_RED + "Собранная Пшеница");
    List<String> lore = new ArrayList<>();
    lore.add(ChatColor.GRAY + "Эту пшеницу вы собрали на подработке");
    meta.setCustomModelData(704);
    meta.setLore(lore);
    item.setItemMeta(meta);
    gettedwheat = item;
    if(itemed.isSimilar(item)) {
     // Тут выполняю код
} else {
 // Тут код выполняю если нету пщеницы такой.
}

}
Проблема у такого кода, если в инвентаре больше двух стаков, то оно проверяет один стак, то-есть как-то из инвенторя с помощью метода setAmount(0); удаляется только один стак(ну тоесть он же работает только с одним) и если ещё раз ввести команду уже со вторым оставшиемся стаком - пишет что в инвенторе нету специальной пшеницы, и что бы система увидела пщеницу надо её переложить в инвенторе.
Второй вариант:
Код:
if(player.getInventory().contains(itemed)) {
 // Выполняю код
}
// Или ещё вот так:
if(player.getInventory().contains(itemed)) {
  int amount = itemed.getAmount();
  if(player.getInventory().contains(itemed, amount)) {
   // Тут выполняю уже
}
}

Каким способом можно проверять наличие всех стаков специальной пшеницы в инвенторе?
 
Inventory#all вернет тебе мапу с ключом слота и значениями предметов.
 
Спасибо, жаль давно ответили, а он используется каким способом? Методом? Циклом? Проверкой?
Ну, если ты про способ использования, то как угодно. Если просто хочешь удалить все предметы, то можно циклом
PHP:
Map<Integer, ? extends ItemStack> items = inv.all(specialWheat);
for (Integer slot : items.keySet()) inv.remove(slot);
Если нужно подсчитать и удалить, то аналогично
PHP:
int amount = 0;
for (Map.Entry<Integer, ? extends ItemStack> entry : items.entrySet()) {
    amount += entry.getValue().getAmount();
    inv.remove(entry.getKey());
}
В целом, можно заниматься всем этим и без #all, так и эффективнее будет, но куда проще и быстрее будет воспользоваться этим методом.
 
Ну, если ты про способ использования, то как угодно. Если просто хочешь удалить все предметы, то можно циклом
PHP:
Map<Integer, ? extends ItemStack> items = inv.all(specialWheat);
for (Integer slot : items.keySet()) inv.remove(slot);
Если нужно подсчитать и удалить, то аналогично
PHP:
int amount = 0;
for (Map.Entry<Integer, ? extends ItemStack> entry : items.entrySet()) {
    amount += entry.getValue().getAmount();
    inv.remove(entry.getKey());
}
В целом, можно заниматься всем этим и без #all, так и эффективнее будет, но куда проще и быстрее будет воспользоваться этим методом.
Спасибо.
 
Я бы не открывал тему, но меня очень всё разозлило. Вот код:

Код:
                Player plr = (Player) sender;
                    ItemStack item = new ItemStack(Material.WHEAT);
                    ItemMeta meta = item.getItemMeta();
                    meta.setDisplayName(ChatColor.DARK_RED + "Собранная Пшеница");
                    List<String> lore = new ArrayList<>();
                    lore.add(ChatColor.GRAY + "Эту пшеницу вы собрали на подработке");
                    meta.setCustomModelData(704);
                    meta.setLore(lore);
                    item.setItemMeta(meta);   
                    int amount = 0;
                    for (Map.Entry<Integer, ? extends ItemStack> entry : plr.getInventory().all(item).entrySet()) {
                        amount += entry.getValue().getAmount();
                        plr.getInventory().clear(entry.getKey());
                        int WellToSell = 2; //Курс денег за пшеницу одну
                        int givved = 0; //Скока даст за продажу
                        givved = amount * WellToSell; // Вычисляем сколько даст денег
                        plugin.onResetCollectsWheat(plr); // Тут забей
                        plugin.econ.depositPlayer(plr, givved); //Выдача денег.
                        plr.sendMessage(ChatColor.GREEN + "За продажу вы получили: " + ChatColor.WHITE + givved + ChatColor.GREEN + " Монет");
                        return true;
                    
                    
                        }
Этот же код не выполняется, выполняется return false; который за последней скобкой, не понимаю в чём проблема. Уже проверку на игрока убрал, убрал проверку что это выполняется если аргументы определённые. Нечего не помогает.. Бесит уже.. Мне кажется дело в вашем коде, так как даже ошибки нету.
 
Я бы не открывал тему, но меня очень всё разозлило. Вот код:

Код:
                Player plr = (Player) sender;
                    ItemStack item = new ItemStack(Material.WHEAT);
                    ItemMeta meta = item.getItemMeta();
                    meta.setDisplayName(ChatColor.DARK_RED + "Собранная Пшеница");
                    List<String> lore = new ArrayList<>();
                    lore.add(ChatColor.GRAY + "Эту пшеницу вы собрали на подработке");
                    meta.setCustomModelData(704);
                    meta.setLore(lore);
                    item.setItemMeta(meta); 
                    int amount = 0;
                    for (Map.Entry<Integer, ? extends ItemStack> entry : plr.getInventory().all(item).entrySet()) {
                        amount += entry.getValue().getAmount();
                        plr.getInventory().clear(entry.getKey());
                        int WellToSell = 2; //Курс денег за пшеницу одну
                        int givved = 0; //Скока даст за продажу
                        givved = amount * WellToSell; // Вычисляем сколько даст денег
                        plugin.onResetCollectsWheat(plr); // Тут забей
                        plugin.econ.depositPlayer(plr, givved); //Выдача денег.
                        plr.sendMessage(ChatColor.GREEN + "За продажу вы получили: " + ChatColor.WHITE + givved + ChatColor.GREEN + " Монет");
                        return true;
                  
                  
                        }
Этот же код не выполняется, выполняется return false; который за последней скобкой, не понимаю в чём проблема. Уже проверку на игрока убрал, убрал проверку что это выполняется если аргументы определённые. Нечего не помогает.. Бесит уже.. Мне кажется дело в вашем коде, так как даже ошибки нету.
Да, скорее всего проблема в том, что #all сверяет предметы через #equals. В таком случае несовсем понятно, зачем вообще возвращать Map, но класс древний, неудивительно.
Набросал такой метод - потестил, вроде работает
PHP:
private static int countAndRemove(Inventory inv, ItemStack search) {
    int amount = 0;
    for (int i = 0; i < inv.getSize(); i++) {
        ItemStack item = inv.getItem(i);
        if (search.isSimilar(inv.getItem(i))) {
            amount += item.getAmount();
            inv.clear(i);
        }
    }
    return amount;
}
Просто вызывай countAndRemove(player.getInventory(), specialWheat), и оно вернет тебе количество.
 
Да, скорее всего проблема в том, что #all сверяет предметы через #equals. В таком случае несовсем понятно, зачем вообще возвращать Map, но класс древний, неудивительно.
Набросал такой метод - потестил, вроде работает
PHP:
private static int countAndRemove(Inventory inv, ItemStack search) {
    int amount = 0;
    for (int i = 0; i < inv.getSize(); i++) {
        ItemStack item = inv.getItem(i);
        if (search.isSimilar(inv.getItem(i))) {
            amount += item.getAmount();
            inv.clear(i);
        }
    }
    return amount;
}
Просто вызывай countAndRemove(player.getInventory(), specialWheat), и оно вернет тебе количество.
Спасибо, попробую его.
 
Назад
Верх