minecraft
Слушатели событий в Буките
Поиск…
Создание прослушивателя событий
Чтобы зарегистрировать свои методы, класс, содержащий EventHandler (s), должен реализовать интерфейс Listener.
import org.bukkit.event.Listener;
public final class ListenerClass implements Listener {
}
Вам необходимо зарегистрировать прослушиватель событий, добавив следующий вызов к методу onEnable в классе, который расширяет JavaPlugin:
getServer().getPluginManager().registerEvents(new ListenerClass(), this);
Чтобы прослушать любое заданное событие в вашем классе слушателя, вы должны создать метод с аннотацией @EventHandler в методе. Тип события определяется типом в единственном аргументе метода. Метод может быть назван как угодно.
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerLoginEvent;
public class ListenerClass implements Listener {
@EventHandler
public void onPlayerLogin(PlayerLoginEvent event) {
event.getPlayer().sendMessage("Welcome to the server!");
}
}
Параметры EventHandler
Аннотация org.bukkit.event.EventHandler
принимает пару параметров.
priority - Указывает приоритет вашего слушателя. Есть шесть разных приоритетов в порядке исполнения: LOWEST, LOW, NORMAL [default], HIGH, HIGHEST, MONITOR. Эти константы относятся к перечислению org.bukkit.event.EventPriority
.
Если вы хотите изменить исход события, выберите очень осторожно от LOWEST до HIGHEST. Предлагаемые обобщенные защитные плагины на LOWEST, более конкретные плагины на NORMAL и переопределение плагинов на HIGH. Если вы хотите действовать, когда происходит событие, но не измените результат, используйте MONITOR.
Примечание. Приоритет MONITOR должен использоваться только для чтения. Этот приоритет полезен для регистрации плагинов, чтобы увидеть результаты события, и изменение значений может помешать этим типам плагинов.
ignoreCancelled - логическое значение, указывающее, должен ли ваш слушатель срабатывать, если событие было отменено до того, как очередь слушателя обработает событие. Неверно по умолчанию.
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerLoginEvent;
public final class LoginListener implements Listener {
@EventHandler
public void normalLogin(PlayerLoginEvent event) {
// Some code here
}
@EventHandler(priority = EventPriority.HIGH)
public void highLogin(PlayerLoginEvent event) {
// Some code here
}
}
Создание пользовательских событий
Иногда вам нужно создать свое собственное Событие, которое другие плагины могут прослушать (Vault, среди других плагинов, делает это) и даже отменить. API событий Bukkit позволяет это сделать возможным. Все, что вам нужно сделать, это создать новый класс, расширить его Event
, добавить обработчики и атрибуты, необходимые вашему событию (например, Player или message).
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public final class CustomEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private String message;
public CustomEvent(String example) {
message = example;
}
public String getMessage() {
return message;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
Вызов пользовательского события
Вы контролируете создание и вызывать свои события, где вы называете это полностью зависит от вас. Вот пример
// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());
Помните: вы контролируете свои события. Если вы не назовете это и не подействуйте на него, этого не произойдет!
Прослушивание пользовательского события
Прослушивание пользовательского события совпадает с прослушиванием обычного события.
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
public final class CustomListener implements Listener {
@EventHandler
public void onCustomEvent(CustomEvent event) {
// Some code here
}
}
Внедрение CustomEvent Cancellable
Если вы хотите, чтобы ваше событие было boolean cancelled
, просто добавьте implements Cancellable
, boolean cancelled
и getter и setter:
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Cancellable;
public final class CustomEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private String message;
private boolean cancelled;
public CustomEvent(String example) {
message = example;
}
public String getMessage() {
return message;
}
public boolean isCancelled() {
return cancelled;
}
public void setCancelled(boolean cancel) {
cancelled = cancel;
}
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
После этого вы можете проверить, отменял ли плагин пользовательское событие.
// 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()) {
Bukkit.getServer().broadcastMessage(event.getMessage());
}
Отмена регистрации событий или слушателей
Вы можете отменить регистрацию отдельных событий, всех классов слушателей или всех событий, зарегистрированных вашим плагином или даже другими плагинами!
Отменить регистрацию определенного события
Каждый класс событий имеет статический метод getHandlerList (), вызывает это, а затем вы можете использовать метод .unregister ().
PlayerInteractEvent.getHandlerList().unregister(plugin);
// this will unregister all PlayerInteractEvent instances from the plugin
// you can also specify a listener class instead of plugin.
Теперь вы знаете, зачем вам нужен getHandlerList () в ваших пользовательских событиях.
Отменить регистрацию всех событий
Используя класс HandlerList и его статический метод unregisterAll (), вы можете легко отменить регистрацию событий из классов или плагинов-слушателей.
HandlerList.unregisterAll(plugin);
// this will unregister all events from the specified plugin
// you can also specify a listener class instead of plugin.