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

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

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

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

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Добрый день!

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

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

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

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

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

    Альтернативу я пока не нашёл. Никто не сталкивался? Как побороть проблему и принудительно обновлять инвентарь?
     
    ВремяПриключений нравится это.
  2. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Как странно... Использую именно методы
    Код:
    player.removeItem (new ItemStack (id, amount, data));
    player.addItem (new ItemStack (id2, amount2, data2));
    инвентарь обновляется сразу. или я что-то не правильно понял?
     
  3. ensirius

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

    Баллы:
    123
    Устаревший метод работает.
     
  4. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    @fromgate,
    Разве все изменения инвентаря не обновляются в реальном времени?
    У меня была проблема с обновлением инвентаря до того, как метод устарел. Тоже решал обновлением. Теперь обновлять ничего не требуется.
    Я так понимаю, должно быть сначала player.getInventory() а потом уже все операции с инвентарем.
    Код запускается синхронно? В обработчике событий или команд?
     
  5. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Мне тоже кажется что теперь при изменении инвентаря одним из вышеприведенных методов он автоматически обновляется...
     
  6. ensirius

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

    Баллы:
    123
    Не знаю как в букките, но в стандартном, все же надо обновлять после операций.
     
    ВремяПриключений нравится это.
  7. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Ну.. В данном случае речь идет о букките ;)
     
  8. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Да я тоже был уверен, что должно обновлять. Но... не обновляет. Точнее даже так. Одиночный addItem - работает нормально. Одиночный removeItem ещё не проверял, но вот сразу removeItem и после него addItem - не работает. Есть одна мысль, если я буду прав - то будет баг репорт ;) Сегодня ещё побьюсь вечерком. Чего наковыряю - напишу.
     
  9. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    В общем я чего-то добился. Прав был китайский поэт Оуяна Сю который как-то сказал: «И я чаще всего пишу свои произведения в трех местах — верхом на коне, лежа на изголовье и сидя в уборной. Ведь только в этих местах рождаются лучшие замыслы!» В общем, сегодня по пути с работы, за рулем своего "коня" я придумал как можно разрулить эту ситуацию ;)

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

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

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

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

    В общем проверю во всем ли виновато именно сочетание EMPTY_MAP и MAP. Если да - то это очень забавный баг.
     
  10. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    В обработчике команды:
    Код:
    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: сейчас глянем насчет карт
     
    ВремяПриключений нравится это.
  11. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    И эта замена тоже отлично работает.
    НО:
    допустим, существуют карты [0...7]. Мы даем игроку карту №15. тогда игрок получит карту со следующим номером (8) и начнет рендерить ее.
    Далее, изменяем напрямую data у карты на 15. значение устанавливается в 9. (следующая свободная карта.) карта в руках заменяется на новую, начинает рендериться.
    Если редактируем напрямую NBT тег, будет та же вигня. "Выше головы не прыгнешь".

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

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    DPOH-VAR, да нет не то.

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

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