Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

ql_Nik_lp

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

Гуглить пробовал, толкового ничего не нашел - все советуют .remove();
Заранее благодарю.
 
Сам метод удаления правильный, может быть сверяете неверно? Т.е. через player.getInventory().contains(itemStack)? Попробуйте player.getInventory().contains(itemStack, itemStack.getAmount());
 
Сам метод удаления правильный, может быть сверяете неверно? Т.е. через player.getInventory().contains(itemStack)? Попробуйте player.getInventory().contains(itemStack, itemStack.getAmount());

Сверяю через equals
Правильнее быть не может.

Проблема не в "нахождении" предмета - точно, а в том что удаляет он все его экземпляры.
 
Вы перебором чтоли проверяете?
for(is : player.getInventory().getContents()) if(is.equals(itemStack)) { code } ?
Попробуйте все это заменить на то, что я выше написал:
if(player.getInventory().contains(itemStack, itemStack.getAmount()) {
code...
player.getInventory().remove(itemStack);
}
 
Вы перебором чтоли проверяете?
for(is : player.getInventory().getContents()) if(is.equals(itemStack)) { code } ?
Попробуйте все это заменить на то, что я выше написал:
if(player.getInventory().contains(itemStack, itemStack.getAmount()) {
code...
player.getInventory().remove(itemStack);
}
Как я понял ТС хочет от 10 печенек отнять 1, а не найти и удалить 1 печеньку.
Я с телефона много не скажу, но подскажу: найди слот, в котором лежит этот предмет независимо от количества. От этого предмета отними 1 шутку и положи в тот слот. Как то так.
 
Как я понял ТС хочет от 10 печенек отнять 1, а не найти и удалить 1 печеньку.
Я с телефона много не скажу, но подскажу: найди слот, в котором лежит этот предмет независимо от количества. От этого предмета отними 1 шутку и положи в тот слот. Как то так.
Ты верно понял тс :)
Но у меня так же имеется проблема вида:
В инвентаре 10 слотов занимают 10 печенек
Inventory.remove(печенька);
И 10 штук пропадают
 
Ты верно понял тс :)
Но у меня так же имеется проблема вида:
В инвентаре 10 слотов занимают 10 печенек
Inventory.remove(печенька);
И 10 штук пропадают
Не юзай вообще remove, сделай перебор слотов, получи нужный предмет из слота через getSlot() (Вроде был такой) и теперь уже меняй количество предмета через setAmount()
Я скоро приеду домой и смогу нормально помочь:)
 
remove перебирает все слоты, и если итем в слоте equals нужному итему, то удаляет его. перебирай слоты сам.
 
Можно попробовать так:

Код:
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);
 
@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);
}
ну как то так =\
 
@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);
}
ну как то так =\

и что это? из каждого слота отнять по одному айтему? и что если предмет в слоте null? NPE. что-то как-то не так.
 
и что это? из каждого слота отнять по одному айтему? и что если предмет в слоте null? что-то как-то не так.
ну забыл написать про проверки, я 2 недели не занимался кодингом, пощади
 

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

Назад
Верх