Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите [Решено] Таинственный баг

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

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

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Доброго времени суток.
    При написании RPGInventory (ссылка в подписи) возник очень странный баг, с которым борюсь уже третий

    В чем суть:

    В плагине есть еда для питомцев, которая имеет текстуру айтема указаннаго в конфиге (по умолчанию кость). И если попробовать подобрать обычную кость (выпавшую из скелета, например), то весь инвентарь забивается обычными костями с количеством 0. При попытке дропнуть или взять из слота они исчезают. Но как только подходишь к кости, инвентарь снова до отказа забивается фантомными костями. Я бы сам отследил и устранил баг, но вот беда - у меня на локальной машине он не проявляется.

    Нигде в событиях поднятия вещи еда питомцев не фигурирует.

    Что пробовали:
    • Первым делом сменили в конфиге кость на мясо и после этого все то же самое повторилось с мясом.
    • Потом отключили плагин - баг исчез.
    • Заметили, что баг работает, только если занят слот оружия, поэтому я решил, что каким-то образом багует моя система блокировки слота оружия и заменил ее на новую, но баг остался.
    • Потом я решил, что это может быть из-за того, что я каким-то образом порчу что-то рефлексиями и закомментировал их использование - никаких изменений.
    • Пробовал отловить при каком событии появляется баг - прослушал все события связанные с игроком или инвентарем и писал в чат когда какое событие - баг не зависит от события. То есть, например, после команды /give все слоты хотбара забиваются мнимыми костями, а реальная кость дропается. Естественно, никакого события не происходит, если не считать, что из-за того, что кость лежит рядом, возникает куча ItemPickip эвентов, пока не забьется весь инвентарь.
    Никак не могу понять что может стать причиной бага. Нужна статистическая информация, чтобы понять в каких условиях он появляется.
     
    Последнее редактирование: 1 сен 2015
  2. Хостинг MineCraft
    <
  3. leonmark061

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

    Баллы:
    76
    На самом деле, это не баг...
    В ваш плагин вселился дух плохого кода, вызывайте экзорциста.
     
  4. kirill2011s

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

    Баллы:
    103
    Берем и используем отладчик.
     
  5. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    2015-09-02_10.40.40.png

    Подтверждаю.

    Поковыряю, расскажу, что нашёл.
    UPD1: Проблема в самом предмете minecraft:bone . После выгрузки плагина баг остаётся.
    UPD2: Проблема с обработкой еды для питомца. Любой предмет, что есть еда - будет подниматься с таким результатом.
    UPD3: Проблема кроется в ru.endlesscode.rpginventory.pets.PetFood:? :: private void createFoodItem(String id)
    UPD4: Проблема локализирована в ru.endlesscode.rpginventory.utils.ItemUtils.setMaxStackSize(ItemStack, int)
    UPD5: Проблема решена (?): //Removed
    UPD6: Снёс использованные исходники, накатил нулёвые, исправил с выше изложенным "патчем". Баг остался. menya naebali :c
    UPD7: //Removed
    UPD8: Ошибка найдена: В ветке food.* отсутствует переменная stack-size.

    Проблема решена.
    /thread

    2015 09 02_11-59-55.png

    З.Ы.: Не используй рефлексию для установки максимального значения стака предмета. Ты устанавливаешь maxAmout для материала (т.е. для всего), вместо требуемого тебе ItemStack.
     
    Последнее редактирование: 2 сен 2015
  6. Автор темы
    OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    :silence: Я.. я просто... блиин. Забыл в конфиг добавить... спать надо больше.
    Ага, понял. Есть варианты это сделать только для экземпляра ItemStack?
     
  7. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Если только добавлять новый предмет :D

    Ну а на деле я без понятия, как это реализовывать. Если слушать PlayerDropItemEvent и принудительно ставить максимальное количество... Но тогда будет война со стакером spigot'а / ванили.
    Да и гиблое это дело, устанавливать maxStackSize для нужного тебе ItemStack. В некоторых случаях первая строчка - единственное решение проблемы.
     
  8. Автор темы
    OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    У меня была идея создать объект, расширяющий CraftItemStack и в нем заменить метод getMaxStackSize(). А потом подменять им настоящий предмет, при создании. Но CraftItemStack это NMS.
    Можно-ли как-то реализовать раширение неизвестного класса? :D То есть унаследовать его от MinecraftReflection.getCraftItemStackClass() (ProtocolLib)
    В принципе, я знаю, что можно сделать кучу классов для каждой поддерживаемой версии NMS, но через MinecraftReflection было бы удобней.
     
  9. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    CraftItemStack - это стопка предметов. Максимальное количество предметов надо задавать в Item.
     
  10. Автор темы
    OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Что я сейчас и делаю. И это дает эффект на все кости, а не только на мою. Потому я и хочу подменить метод getMaxStackSize().
     
Статус темы:
Закрыта.

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