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

Помогите Удаление предмета из карманов - апдейт инвентаря?!

fromgate

Старожил
Пользователь
Баллы
173
Имя в Minecraft
fromgate
Добрый день!

Не думал, что наступлю на такие грабли. Более того не думал, что такие грабли остались в бакките.

В общем есть задача убрать определенный предмет (в количестве одна штука) из инвентаря (не из рук) игрока. В замен выдать ему другой предмет.

Казалось бы куда уж проще:
player.removItem (new ItemStack (id, amount, data));
и
player.addItem (new ItemStack (id2, amount2, data2));

А оказывается - это проблема. Когда-то давно я это делал и после вызова подобных команд использовал метод player.updateInventory(); - это производило "переотправку" инвентаря клиенту и результат был такой как надо - игрок видел изменение инвентаря.

Сейчас Player.updateInventory() отмечен устаревшим. И собственно уже не работает как надо.
До перелогина изменение в инвентаре не отображаются.

Альтернативу я пока не нашёл. Никто не сталкивался? Как побороть проблему и принудительно обновлять инвентарь?
 
Как странно... Использую именно методы
Код:
player.removeItem (new ItemStack (id, amount, data));
player.addItem (new ItemStack (id2, amount2, data2));
инвентарь обновляется сразу. или я что-то не правильно понял?
 
@fromgate,
Разве все изменения инвентаря не обновляются в реальном времени?
У меня была проблема с обновлением инвентаря до того, как метод устарел. Тоже решал обновлением. Теперь обновлять ничего не требуется.
Я так понимаю, должно быть сначала player.getInventory() а потом уже все операции с инвентарем.
Код запускается синхронно? В обработчике событий или команд?
 
@fromgate,
Разве все изменения инвентаря не обновляются в реальном времени?
У меня была проблема с обновлением инвентаря до того, как метод устарел. Тоже решал обновлением. Теперь обновлять ничего не требуется.
Я так понимаю, должно быть сначала player.getInventory() а потом уже все операции с инвентарем.
Код запускается синхронно? В обработчике событий или команд?
Мне тоже кажется что теперь при изменении инвентаря одним из вышеприведенных методов он автоматически обновляется...
 
Да я тоже был уверен, что должно обновлять. Но... не обновляет. Точнее даже так. Одиночный addItem - работает нормально. Одиночный removeItem ещё не проверял, но вот сразу removeItem и после него addItem - не работает. Есть одна мысль, если я буду прав - то будет баг репорт ;) Сегодня ещё побьюсь вечерком. Чего наковыряю - напишу.
 
В общем я чего-то добился. Прав был китайский поэт Оуяна Сю который как-то сказал: «И я чаще всего пишу свои произведения в трех местах — верхом на коне, лежа на изголовье и сидя в уборной. Ведь только в этих местах рождаются лучшие замыслы!» В общем, сегодня по пути с работы, за рулем своего "коня" я придумал как можно разрулить эту ситуацию ;)

Ситуация такая. Я меняю EMPTY_MAP на MAP с заданным ID.

По сути это два последовательных метода
player.getInventory().removeItem(emptymap);
player.getInventory().addItem(simlemap);

В результате визуально ничего не происходит.Но если, перезайти, или обновить сундук - происходит обновление.

Поборол я у себя так. Я вынес player.getInventory().addItem(simlemap); в delayed task, с задержкой 1 тик и все заработало.

В общем проверю во всем ли виновато именно сочетание EMPTY_MAP и MAP. Если да - то это очень забавный баг.
 
В обработчике команды:
Java:
Player p = (Player) caller.getOwner();
PlayerInventory inv = p.getInventory();
inv.removeItem(new ItemStack(35,4));
inv.addItem(new ItemStack(5));
caller.send("item test!");
return true;
было: стек(50 шерсти), стек(9 дерева)
стало: стек(46 шерсти) стек(10 дерева)
Ничего обновлять не пришлось.
ПС: обе эти функции не содержат обновлений инвентаря.
UPD: сейчас глянем насчет карт
 
В общем проверю во всем ли виновато именно сочетание EMPTY_MAP и MAP. Если да - то это очень забавный баг.
И эта замена тоже отлично работает.
НО:
допустим, существуют карты [0...7]. Мы даем игроку карту №15. тогда игрок получит карту со следующим номером (8) и начнет рендерить ее.
Далее, изменяем напрямую data у карты на 15. значение устанавливается в 9. (следующая свободная карта.) карта в руках заменяется на новую, начинает рендериться.
Если редактируем напрямую NBT тег, будет та же вигня. "Выше головы не прыгнешь".

@fromgate, может проблема в том, что функция выполняется асинхронно? Многие функции ведут себя совершенно непредсказуемо, будучи не в главном потоке.
 
DPOH-VAR, да нет не то.

Функция выполняется в PlayerInteractEntityEvent. Сейчас перепроверил - removeItem тоже не отрабатывалось как надо. Если был стак EMPTY_MAP (они лежат не в руке, а в инвентаре, т.е. не инициализируются). То пока не вытаскиваю removeItem в delayed task - изменение количества не отображается. Бред какой-то.
 

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

Назад
Верх