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

Помогите Как работать с кастомными евентами [Решено]

Тема в разделе "Разработка плагинов для новичков", создана пользователем IlyaHaker, 3 фев 2019.

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

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

    Баллы:
    76
    При срабатывании PlayerInteractEvent, если у игрока в руке находится определенный предмет, должно произойти дополнительное событие. Для этого вызываю кастомный евент. Как и где лучше реализовать его работу? В каком-нибудь конструкторе?(думаю, плохой вариант) Или, может, при прослушивании его? И перед началом выполнения события проверить его поле isCancelled
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Естественно, что эвент нужно обрабатывать в классе слушателя, как и любые другие события.
    Проверять, отменён ли?
    Ну, в целом можно использовать параметр ignoreCancelled аннотации EventHandler. Опять же, как и с любыми другими событиями
     
  3. Автор темы
    IlyaHaker

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

    Баллы:
    76
    Не понял, сбил с толку пример:
    Код:
    // Create the event here
    CustomEvent event = new CustomEvent("Sample Message");
    // Call the event
    Bukkit.getServer().getPluginManager().callEvent(event);
    // Check if the event is not cancelled
    if (!event.isCancelled()) {
       // Now you do the event
       Bukkit.getServer().broadcastMessage(event.getMessage());
    }
    Реализация события происходит сразу после его вызова, в той же функции.
    Выходит, событие вызывается, оно прослушивается, и, если оно не отменилось, то выполняется код дальше?
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это не реализация при выполнении события.
    Это действие уже после выполнения всех обработчиков.
    Поэтому да, если событие по итогу не отменилось, то выполнится broadcastMessage
     
  5. Автор темы
    IlyaHaker

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

    Баллы:
    76
    Тогда что есть реализация? В моем понимании реализация - то, что выполняет евент.
    Например, AsyncPlayerChatEvent, игрок пишет в чат сообщение, если isCancelled() - false, то сообщение отправляется
    Так же и тут, если isCancelled() - false, то выполнится broadcastMessage
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну, если так - то да. Я, когда говорил про реализацию, имел в виду код в обработчиках.
    Не суть.

    Возьмём BlockPlaceEvent, чтобы было понятнее.
    Он создается и вызывается в ядре при попытке установить блок.
    Все плагины проверяют, может ли игрок сделать это.
    Банально, например, могут проверить, имеется ли у игрока какое-либо право.
    После завершения работы хендлеров управление возвращается в ядро.
    Если событие было отменно - ядро отправляет ломавшему старый (актуальный) блок, ибо клиент заменяет его на воздух ещё до ответа сервера.
    Если разрушение блока не было запрещено - сервер устанавливает новое значение блока в чанк в оперативной памяти и рассылает всем игрокам информацию об изменении.
    Как раз это и есть твой sendMessage.
     
  7. Автор темы
    IlyaHaker

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

    Баллы:
    76
    В общем, спасибо за помощь и разъяснения)
     
Статус темы:
Закрыта.

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