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

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

IlyaHaker

Активный участник
Пользователь
Баллы
76
При срабатывании PlayerInteractEvent, если у игрока в руке находится определенный предмет, должно произойти дополнительное событие. Для этого вызываю кастомный евент. Как и где лучше реализовать его работу? В каком-нибудь конструкторе?(думаю, плохой вариант) Или, может, при прослушивании его? И перед началом выполнения события проверить его поле isCancelled
 
Естественно, что эвент нужно обрабатывать в классе слушателя, как и любые другие события.
Проверять, отменён ли?
Ну, в целом можно использовать параметр ignoreCancelled аннотации EventHandler. Опять же, как и с любыми другими событиями
 
Естественно, что эвент нужно обрабатывать в классе слушателя, как и любые другие события.
Проверять, отменён ли?
Ну, в целом можно использовать параметр ignoreCancelled аннотации EventHandler. Опять же, как и с любыми другими событиями
Не понял, сбил с толку пример:
Код:
// 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());
}
Реализация события происходит сразу после его вызова, в той же функции.
Выходит, событие вызывается, оно прослушивается, и, если оно не отменилось, то выполняется код дальше?
 
Не понял, сбил с толку пример:
Код:
// 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());
}
Реализация события происходит сразу после его вызова, в той же функции.
Выходит, событие вызывается, оно прослушивается, и, если оно не отменилось, то выполняется код дальше?
Это не реализация при выполнении события.
Это действие уже после выполнения всех обработчиков.
Поэтому да, если событие по итогу не отменилось, то выполнится broadcastMessage
 
Это не реализация при выполнении события.
Это действие уже после выполнения всех обработчиков.
Поэтому да, если событие по итогу не отменилось, то выполнится broadcastMessage
Тогда что есть реализация? В моем понимании реализация - то, что выполняет евент.
Например, AsyncPlayerChatEvent, игрок пишет в чат сообщение, если isCancelled() - false, то сообщение отправляется
Так же и тут, если isCancelled() - false, то выполнится broadcastMessage
 
В моем понимании реализация - то, что выполняет евент.
Ну, если так - то да. Я, когда говорил про реализацию, имел в виду код в обработчиках.
Не суть.

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