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

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

Статус
Закрыто для дальнейших ответов.

OsipXD

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

В чем суть:

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

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

Что пробовали:
  • Первым делом сменили в конфиге кость на мясо и после этого все то же самое повторилось с мясом.
  • Потом отключили плагин - баг исчез.
  • Заметили, что баг работает, только если занят слот оружия, поэтому я решил, что каким-то образом багует моя система блокировки слота оружия и заменил ее на новую, но баг остался.
  • Потом я решил, что это может быть из-за того, что я каким-то образом порчу что-то рефлексиями и закомментировал их использование - никаких изменений.
  • Пробовал отловить при каком событии появляется баг - прослушал все события связанные с игроком или инвентарем и писал в чат когда какое событие - баг не зависит от события. То есть, например, после команды /give все слоты хотбара забиваются мнимыми костями, а реальная кость дропается. Естественно, никакого события не происходит, если не считать, что из-за того, что кость лежит рядом, возникает куча ItemPickip эвентов, пока не забьется весь инвентарь.
Никак не могу понять что может стать причиной бага. Нужна статистическая информация, чтобы понять в каких условиях он появляется.
 
Последнее редактирование:
На самом деле, это не баг...
В ваш плагин вселился дух плохого кода, вызывайте экзорциста.
 
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.
 
Последнее редактирование:
UPD8: Ошибка найдена: В ветке food.* отсутствует переменная stack-size.
:silence: Я.. я просто... блиин. Забыл в конфиг добавить... спать надо больше.
З.Ы.: Не используй рефлексию для установки максимального значения стака предмета. Ты устанавливаешь maxAmout для материала (т.е. для всего), вместо требуемого тебе ItemStack.
Ага, понял. Есть варианты это сделать только для экземпляра ItemStack?
 
Ага, понял. Есть варианты это сделать только для экземпляра ItemStack?
Если только добавлять новый предмет :D

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

Ну а на деле я без понятия, как это реализовывать. Если слушать PlayerDropItemEvent и принудительно ставить максимальное количество... Но тогда будет война со стакером spigot'а / ванили.
Да и гиблое это дело, устанавливать maxStackSize для нужного тебе ItemStack. В некоторых случаях первая строчка - единственное решение проблемы.
У меня была идея создать объект, расширяющий CraftItemStack и в нем заменить метод getMaxStackSize(). А потом подменять им настоящий предмет, при создании. Но CraftItemStack это NMS.
Можно-ли как-то реализовать раширение неизвестного класса? :D То есть унаследовать его от MinecraftReflection.getCraftItemStackClass() (ProtocolLib)
В принципе, я знаю, что можно сделать кучу классов для каждой поддерживаемой версии NMS, но через MinecraftReflection было бы удобней.
 
У меня была идея создать объект, расширяющий CraftItemStack и в нем заменить метод getMaxStackSize(). А потом подменять им настоящий предмет, при создании. Но CraftItemStack это NMS.
Можно-ли как-то реализовать раширение неизвестного класса? :D То есть унаследовать его от MinecraftReflection.getCraftItemStackClass() (ProtocolLib)
В принципе, я знаю, что можно сделать кучу классов для каждой поддерживаемой версии NMS, но через MinecraftReflection было бы удобней.
CraftItemStack - это стопка предметов. Максимальное количество предметов надо задавать в Item.
 
CraftItemStack - это стопка предметов. Максимальное количество предметов надо задавать в Item.
Что я сейчас и делаю. И это дает эффект на все кости, а не только на мою. Потому я и хочу подменить метод getMaxStackSize().
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх