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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    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
    Погружение в ядро началось очень интересно:
    [​IMG]
     
    Последнее редактирование: 18 окт 2018
  2. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Все верно. События выше происходят до того, как начнется расчет, куда и сколько ставить предметов.
     
  3. alexandrage

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

    Баллы:
    173
    В ивенте никак, ибо клиент за это никак не отвечает, то серверная операция. Придется ручками считать. Сложного там ничего нет, просто идет форыч по индексам от 0 до макс.
     
    Последнее редактирование: 18 окт 2018
  4. Автор темы
    Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Да, ничего сложного. Только куча говнокода: https://pastebin.com/WR2uKZ6s
    Причём после приличного такого рефакторинга.
    И это лишь ради того, чтобы разрешить перемещать предметы с шифтом.
    Сейчас это действие у меня просто-напросто запрещено...
     
    Последнее редактирование: 18 окт 2018
  5. alexandrage

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

    Баллы:
    173
    И ради чего это все?
     
  6. Автор темы
    Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Хотелось бы блокировать конкретные слоты в ивентаре по определённым условиям.
    Собственно, это уже и реализовано. Например, в первом слоте хотбара можно держать только оружие.
    Правда меня очень смущает, что пришлось отключить перемещение предметов с шифтом - для игроков это очень неудобно...
     
  7. alexandrage

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

    Баллы:
    173
    Изи
    Код:
            if (e.getClick() == ClickType.SHIFT_LEFT && e.getClick() == ClickType.SHIFT_RIGHT) {
                //TODO
                e.getSlot();
                e.getHotbarButton();
            }
     
  8. Автор темы
    Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты читал первый пост вообще? Получи номера слотов, в которые будет перемещён стак
     
  9. alexandrage

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

    Баллы:
    173
    В первый пустой, логично же, или там где не полный стак. Когда из сундука, то в конец. Простая система же.
    И тебе лучше спигот напатчить, там где и идет расчет, так проще. Ибо оно идет после ивента, собстно и смысла получать эти слоты нет никакого внутри ивента. Собстно по этому их и нет в ивенте.
     
    Последнее редактирование: 19 окт 2018
  10. Автор темы
    Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    На словах всё просто. Глянь код, который кидал выше. Ну так вот - он не работает. Дорефакторился.
    Походу ядро и буду патчить.
    А по поводу того, что в ивенте инфа эта не нужна - может и так. Но тогда бы хоть отдельный эвент сделали, как с
    InventoryDragEvent... Нужно же как-то контролировать перемещение предметов по инвентарю.
     
  11. alexandrage

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

    Баллы:
    173
    Вообще ни разу не нужно. Только таким извращенным умам как твой).
     
Статус темы:
Закрыта.

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