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

Помогите Удаление одного экземпляра ItemStack из инвентаря

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

  1. Автор темы
    ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Всем доброго, дорогие друзья, и возникла такая проблема:
    Необходимо изъять из инвентаря игрока 1 единицу конкретного объекта
    Задача вроде бы легкая, но суть в том что когда пытаюсь сделать player.getInventory().remove(itemStack);
    То
    1) По скольку сверяет по ItemStack'у, то забирает только то где кол-во предмета - 1.
    2) Забирает все экземпляры того что описано в п. 1

    Гуглить пробовал, толкового ничего не нашел - все советуют .remove();
    Заранее благодарю.
     
    Vedroyder нравится это.
  2. Ukedrethose

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

    Баллы:
    78
    Skype:
    rines_skype
    Имя в Minecraft:
    RinesThaix
    Сам метод удаления правильный, может быть сверяете неверно? Т.е. через player.getInventory().contains(itemStack)? Попробуйте player.getInventory().contains(itemStack, itemStack.getAmount());
     
  3. Автор темы
    ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Сверяю через equals
    Правильнее быть не может.

    Проблема не в "нахождении" предмета - точно, а в том что удаляет он все его экземпляры.
     
    MineMan910 нравится это.
  4. Ukedrethose

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

    Баллы:
    78
    Skype:
    rines_skype
    Имя в Minecraft:
    RinesThaix
    Вы перебором чтоли проверяете?
    for(is : player.getInventory().getContents()) if(is.equals(itemStack)) { code } ?
    Попробуйте все это заменить на то, что я выше написал:
    if(player.getInventory().contains(itemStack, itemStack.getAmount()) {
    code...
    player.getInventory().remove(itemStack);
    }
     
  5. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Как я понял ТС хочет от 10 печенек отнять 1, а не найти и удалить 1 печеньку.
    Я с телефона много не скажу, но подскажу: найди слот, в котором лежит этот предмет независимо от количества. От этого предмета отними 1 шутку и положи в тот слот. Как то так.
     
  6. Автор темы
    ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Ты верно понял тс :)
    Но у меня так же имеется проблема вида:
    В инвентаре 10 слотов занимают 10 печенек
    Inventory.remove(печенька);
    И 10 штук пропадают
     
  7. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Не юзай вообще remove, сделай перебор слотов, получи нужный предмет из слота через getSlot() (Вроде был такой) и теперь уже меняй количество предмета через setAmount()
    Я скоро приеду домой и смогу нормально помочь:)
     
  8. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    remove перебирает все слоты, и если итем в слоте equals нужному итему, то удаляет его. перебирай слоты сам.
     
    Сникерсни и zuma2 нравится это.
  9. Ukedrethose

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

    Баллы:
    78
    Skype:
    rines_skype
    Имя в Minecraft:
    RinesThaix
    Можно попробовать так:

    Код:
    for(ItemStack is : player.getInventory().getContents()) {
        if(is.equals(itemStack)) {
            is.setTypeId(0);
            break;
        }
    }
    Если не пойдет, то:

    Код:
    ItemStack[] contents = player.getInventory().getContents());
    for(int i = 0; i < contents.length; i++) {
        if(contents[i].equals(itemStack)) {
            contents[i] = null;
            break;
        }
    }
    player.getInventory().setContents(contents);
     
    Оригинало_о нравится это.
  10. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    @ql_Nik_lp,
    Код:
    for(int i = 0; i < p.getInventory().getSize(); i++) {
    ItemStack is = p.getInventory().getItem(i);
    // тут проверки, нужный предмет ли и не нулл ли
      is.setAmount(is.getAmount() - 1);
      p.getInventory().setItem(i, is);
    }
    ну как то так =\
     
  11. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    и что это? из каждого слота отнять по одному айтему? и что если предмет в слоте null? NPE. что-то как-то не так.
     
  12. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    ну забыл написать про проверки, я 2 недели не занимался кодингом, пощади
     
    ВремяПриключений нравится это.

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