1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем _MCMaster_, 30 авг 2018.

Статус темы:
Закрыта.
  1. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Hi. Наверное, тупейший вопрос задал но всё же...
    Надо добавить предмет в инвентарь игрока, делаю так:
    Код:
    PlayerInventory inv = player.getInventory();
    inv.addItem(item);
    //item - ItemStack
    
    А дальше что делать? Как присвоить инвентарь inv игроку player?
    player.setInventory(inv) ? - Такого метода нет...
     
  2. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Еще один вопрос: как добавить вещь в определенный слот, и как получать вещь по слоту в инвентаре игрока?
     
  3. Lemar98

    Lemar98 Активный участник Пользователь

    Баллы:
    76
    p.getInventory().addItem() ?
     
  4. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Что ты собрался куда присваивать?
    Ты добавил предмет. Всё. Он добавился. Больше ничего не надо делать.
    Конечно может быть такое, что у игрока полный инвентарь, тогда тебе вернётся не пустая мапа(а если вернётся пустая, значит предмет успешно добавлен). Обычно в таких случаях отменяют выдачу либо просто дропают вещи, которые не поместились около игрока.
     
  5. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Почистить и ставить новые предметы, либо...
    Поэтому обычно игроку открывают виртуальный сундук (player.openInventory()) получают через Bukkit.createInventory()
     
  6. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо за ответы, всё понял. Я сначала так и думал, что больше ничего делать не надо, просто inv.addItem(item); но всё таки решил узнать.
    Теперь надо решить ещё такое:
    Мне надо найти определенный ItemStack в инвентаре игрока, и если его там нет делать одно, если есть другое. (Делаю патроны для RPG)
     
  7. Grazy

    Grazy Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Как вариант можно это:
    Код:
     if (p.getInventory().contains(material)) { //To do }
    
    Но есть и более извращенные и надежные способы.
     
  8. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    material может быть ItemStack'ом с ItemMeta?
     
  9. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Именно.
     
  10. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Отлично!
    Кстати, @imDaniX , может на сайт ещё и туториалы по Bukkit Coding( :D ) заливать?
     
  11. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Тему ещё не закрываю, т.к. осталось несколько вопросов по инвентарю, завтра напишу.
    Good night)
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
        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;
                    }
                }
            }
        }
     
  13. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Спасибо, возьму себе на заметку. Но ведь можно inv.contains(ItemStack)! Или это метод лучше?
     
  14. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Oops... contains() не подходит, потому что он просто проверяет предмет на наличие, а мне надо получить предмет, проверить ItemMeta, уменьшить количество предмета на 1.
    Вот это мне подходит!
     
  15. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    И что я должен указать в качестве параметра c функции checkremove ?
     
  16. Nikolai_Faint

    Nikolai_Faint Активный участник Пользователь

    Баллы:
    96
     
  17. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Нет, я спрашиваю что это за число? (Зачем оно?)
     
  18. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Сколько удалить. Вернет false если нет, или не хватает.
     
    Последнее редактирование: 31 авг 2018
  19. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Если не понял как работает isSimilar, проверяет одинаковые предметы с учетом всей меты.
     
  20. Автор темы
    _MCMaster_

    _MCMaster_ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Понятно)
     
Статус темы:
Закрыта.

Поделиться этой страницей