- Баллы
- 98
- Имя в Minecraft
- Dymeth
Доброго времени суток.
Есть три вопроса по работе с инвентарями в моём любимом бакките.
1) Имеется InventoryClickEvent. Допустим, он вызывается при попытке переместить предмет кликом мыши с зажатым шифтом:
event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY && (event.getClick() == ClickType.SHIFT_LEFT || event.getClick() == ClickType.SHIFT_RIGHT)
Я могу получить слот, из которого переносится стак: event.getSlot()
Но как получить слот, в который этот стак потом попадёт?
Более того, я думаю, этих слотов может быть несколько (если предыдущие уже заполнены).
В идеале получить не только номера слотов, но и количество предметов, которые были туда добавлены (или размер нового стака - это неважно).
2) Опять InventoryClickEvent. Теперь речь про вызов эвента при тройном клике по предмету.
При этом на курсор по-возможности собираются предметы такого же типа из всех слотов:
event.getAction() == InventoryAction.COLLECT_TO_CURSOR
Опять же, получить слот, по которому кликали - не проблема.
Но нужно получить ещё и номера слотов, из которых забираются предметы.
Причём желательно не только номера, но и количество изымаемых предметов.
3) На этот раз EntityPickupItemEvent. Как вы уже догадались, нужно получить номера слотов, в которые будет добавлен стак.
По всем трём вопросам на ум приходит лишь одно решение - копипастить код из ядра, который отвечает за эти действия.
Собственно, в третьем случае (EntityPickupItemEvent) я именно так и сделал.
Отменяется эвент, выполняется попытка выдачи предметов "вручную" - тут уже мои проверки по слотам. В случае успеха отправляется анимация поднятия, воспроизводится соответствующий звук и затем вызывается кастомный EntityPickupItemEvent (наследует его) - просто для совместимости с другими плагинами.
Может, я где-то не доглядел документацию?
Есть ли менее костыльные варианты?
UPD
Погружение в ядро началось очень интересно:
Есть три вопроса по работе с инвентарями в моём любимом бакките.
1) Имеется InventoryClickEvent. Допустим, он вызывается при попытке переместить предмет кликом мыши с зажатым шифтом:
event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY && (event.getClick() == ClickType.SHIFT_LEFT || event.getClick() == ClickType.SHIFT_RIGHT)
Я могу получить слот, из которого переносится стак: event.getSlot()
Но как получить слот, в который этот стак потом попадёт?
Более того, я думаю, этих слотов может быть несколько (если предыдущие уже заполнены).
В идеале получить не только номера слотов, но и количество предметов, которые были туда добавлены (или размер нового стака - это неважно).
2) Опять InventoryClickEvent. Теперь речь про вызов эвента при тройном клике по предмету.
При этом на курсор по-возможности собираются предметы такого же типа из всех слотов:
event.getAction() == InventoryAction.COLLECT_TO_CURSOR
Опять же, получить слот, по которому кликали - не проблема.
Но нужно получить ещё и номера слотов, из которых забираются предметы.
Причём желательно не только номера, но и количество изымаемых предметов.
3) На этот раз EntityPickupItemEvent. Как вы уже догадались, нужно получить номера слотов, в которые будет добавлен стак.
По всем трём вопросам на ум приходит лишь одно решение - копипастить код из ядра, который отвечает за эти действия.
Собственно, в третьем случае (EntityPickupItemEvent) я именно так и сделал.
Отменяется эвент, выполняется попытка выдачи предметов "вручную" - тут уже мои проверки по слотам. В случае успеха отправляется анимация поднятия, воспроизводится соответствующий звук и затем вызывается кастомный EntityPickupItemEvent (наследует его) - просто для совместимости с другими плагинами.
Может, я где-то не доглядел документацию?
Есть ли менее костыльные варианты?
UPD
Погружение в ядро началось очень интересно:
Последнее редактирование: