Помогите Добавить предмет в инвентарь игрока...

Статус
Закрыто для дальнейших ответов.

_MCMaster_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
DragOn4ik
Hi. Наверное, тупейший вопрос задал но всё же...
Надо добавить предмет в инвентарь игрока, делаю так:
Код:
PlayerInventory inv = player.getInventory();
inv.addItem(item);
//item - ItemStack
А дальше что делать? Как присвоить инвентарь inv игроку player?
player.setInventory(inv) ? - Такого метода нет...
 
Еще один вопрос: как добавить вещь в определенный слот, и как получать вещь по слоту в инвентаре игрока?
 
Как присвоить инвентарь inv игроку player?
Что ты собрался куда присваивать?
Ты добавил предмет. Всё. Он добавился. Больше ничего не надо делать.
Конечно может быть такое, что у игрока полный инвентарь, тогда тебе вернётся не пустая мапа(а если вернётся пустая, значит предмет успешно добавлен). Обычно в таких случаях отменяют выдачу либо просто дропают вещи, которые не поместились около игрока.
 
А дальше что делать? Как присвоить инвентарь inv игроку player?
player.setInventory(inv) ? - Такого метода нет...
Почистить и ставить новые предметы, либо...
Поэтому обычно игроку открывают виртуальный сундук (player.openInventory()) получают через Bukkit.createInventory()
 
Спасибо за ответы, всё понял. Я сначала так и думал, что больше ничего делать не надо, просто inv.addItem(item); но всё таки решил узнать.
Теперь надо решить ещё такое:
Мне надо найти определенный ItemStack в инвентаре игрока, и если его там нет делать одно, если есть другое. (Делаю патроны для RPG)
 
Как вариант можно это:
Код:
 if (p.getInventory().contains(material)) { //To do }
Но есть и более извращенные и надежные способы.
 
Тему ещё не закрываю, т.к. осталось несколько вопросов по инвентарю, завтра напишу.
Good night)
 
Мне надо найти определенный ItemStack в инвентаре игрока, и если его там нет делать одно, если есть другое. (Делаю патроны для RPG)
Код:
    public static boolean checkremove(Player p, ItemStack s, int c) {
        if (calc(p, s) >= c) {
            clear(p, s, c);
            return true;
        }
        return false;
    }

    public static int calc(Player p, ItemStack s) {
        int count = 0;
        for (int i = 0; i < p.getInventory().getSize(); i++) {
            ItemStack stack = p.getInventory().getItem(i);
            if (stack == null)
                continue;
            if (stack.isSimilar(s)) {
                count += stack.getAmount();
            }
        }
        return count;
    }

    public static void clear(Player p, ItemStack s, int c) {
        for (int i = 0; i < p.getInventory().getSize(); i++) {
            ItemStack stack = p.getInventory().getItem(i);
            if (stack == null)
                continue;
            if (stack.isSimilar(s)) {
                if (stack.getAmount() == 0)
                    break;
                if (stack.getAmount() <= c) {
                    c = c - stack.getAmount();
                    stack.setAmount(-1);
                }
                if (stack.getAmount() > c) {
                    stack.setAmount(stack.getAmount() - c);
                    c = 0;
                }
            }
        }
    }
 
Код:
    public static boolean checkremove(Player p, ItemStack s, int c) {
        if (calc(p, s) >= c) {
            clear(p, s, c);
            return true;
        }
        return false;
    }

    public static int calc(Player p, ItemStack s) {
        int count = 0;
        for (int i = 0; i < p.getInventory().getSize(); i++) {
            ItemStack stack = p.getInventory().getItem(i);
            if (stack == null)
                continue;
            if (stack.isSimilar(s)) {
                count += stack.getAmount();
            }
        }
        return count;
    }

    public static void clear(Player p, ItemStack s, int c) {
        for (int i = 0; i < p.getInventory().getSize(); i++) {
            ItemStack stack = p.getInventory().getItem(i);
            if (stack == null)
                continue;
            if (stack.isSimilar(s)) {
                if (stack.getAmount() == 0)
                    break;
                if (stack.getAmount() <= c) {
                    c = c - stack.getAmount();
                    stack.setAmount(-1);
                }
                if (stack.getAmount() > c) {
                    stack.setAmount(stack.getAmount() - c);
                    c = 0;
                }
            }
        }
    }
Спасибо, возьму себе на заметку. Но ведь можно inv.contains(ItemStack)! Или это метод лучше?
 
Oops... contains() не подходит, потому что он просто проверяет предмет на наличие, а мне надо получить предмет, проверить ItemMeta, уменьшить количество предмета на 1.
Код:
public static void clear(Player p, ItemStack s, int c) { for (int i = 0; i < p.getInventory().getSize(); i++) { ItemStack stack = p.getInventory().getItem(i); if (stack == null) continue; if (stack.isSimilar(s)) { if (stack.getAmount() == 0) break; if (stack.getAmount() <= c) { c = c - stack.getAmount(); stack.setAmount(-1); } if (stack.getAmount() > c) { stack.setAmount(stack.getAmount() - c); c = 0; } }
Вот это мне подходит!
 
И что я должен указать в качестве параметра c функции checkremove ?
 
Если не понял как работает isSimilar, проверяет одинаковые предметы с учетом всей меты.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх