Помогите Получение номеров слотов при действиях с инвентарями

  • Автор темы Автор темы Dymeth
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Dymeth

Активный участник
Пользователь
Баллы
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
Погружение в ядро началось очень интересно:
gL7KZoT.png
 
Последнее редактирование:
По всем трём вопросам на ум приходит лишь одно решение - копипастить код из ядра, который отвечает за эти действия.
Все верно. События выше происходят до того, как начнется расчет, куда и сколько ставить предметов.
 
В ивенте никак, ибо клиент за это никак не отвечает, то серверная операция. Придется ручками считать. Сложного там ничего нет, просто идет форыч по индексам от 0 до макс.
 
Последнее редактирование:
В ивенте никак, ибо клиент за это никак не отвечает, то серверная операция. Придется ручками считать. Сложного там ничего нет, просто идет форыч по индексам от 0 до макс.
Да, ничего сложного. Только куча говнокода: https://pastebin.com/WR2uKZ6s
Причём после приличного такого рефакторинга.
И это лишь ради того, чтобы разрешить перемещать предметы с шифтом.
Сейчас это действие у меня просто-напросто запрещено...
 
Последнее редактирование:
Да, ничего сложного. Только куча говнокода: https://pastebin.com/WR2uKZ6s
Причём после приличного такого рефакторинга.
И это лишь ради того, чтобы разрешить перемещать предметы с шифтом.
Сейчас это действие у меня просто-напросто запрещено...
И ради чего это все?
 
И ради чего это все?
Хотелось бы блокировать конкретные слоты в ивентаре по определённым условиям.
Собственно, это уже и реализовано. Например, в первом слоте хотбара можно держать только оружие.
Правда меня очень смущает, что пришлось отключить перемещение предметов с шифтом - для игроков это очень неудобно...
 
Хотелось бы блокировать конкретные слоты в ивентаре по определённым условиям.
Собственно, это уже и реализовано. Например, в первом слоте хотбара можно держать только оружие.
Правда меня очень смущает, что пришлось отключить перемещение предметов с шифтом - для игроков это очень неудобно...
Изи
Код:
        if (e.getClick() == ClickType.SHIFT_LEFT && e.getClick() == ClickType.SHIFT_RIGHT) {
            //TODO
            e.getSlot();
            e.getHotbarButton();
        }
 
Ты читал первый пост вообще? Получи номера слотов, в которые будет перемещён стак
В первый пустой, логично же, или там где не полный стак. Когда из сундука, то в конец. Простая система же.
И тебе лучше спигот напатчить, там где и идет расчет, так проще. Ибо оно идет после ивента, собстно и смысла получать эти слоты нет никакого внутри ивента. Собстно по этому их и нет в ивенте.
 
Последнее редактирование:
В первый пустой, логично же, или там где не полный стак. Когда из сундука, то в конец. Простая система же.
И тебе лучше спигот напатчить, там где и идет расчет, так проще. Ибо оно идет после ивента, собстно и смысла получать эти слоты нет никакого внутри ивента. Собстно по этому их и нет в ивенте.
На словах всё просто. Глянь код, который кидал выше. Ну так вот - он не работает. Дорефакторился.
Походу ядро и буду патчить.
А по поводу того, что в ивенте инфа эта не нужна - может и так. Но тогда бы хоть отдельный эвент сделали, как с
InventoryDragEvent... Нужно же как-то контролировать перемещение предметов по инвентарю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх