minecraft
Słuchacze wydarzeń w Bukkit
Szukaj…
Tworzenie detektora zdarzeń
Aby zarejestrować metody, klasa zawierająca EventHandler (s) musi implementować interfejs Listener.
import org.bukkit.event.Listener;
public final class ListenerClass implements Listener {
}
Musisz zarejestrować detektor zdarzeń, dodając następujące wywołanie do metody onEnable w klasie rozszerzającej JavaPlugin:
getServer().getPluginManager().registerEvents(new ListenerClass(), this);
Aby odsłuchać dowolne zdarzenie w klasie nasłuchiwania, musisz utworzyć metodę z adnotacją @EventHandler w metodzie. Typ zdarzenia jest określony przez typ w jedynym argumencie metody. Metodę można nazwać dowolnie.
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!");
}
}
Parametry EventHandler
Adnotacja org.bukkit.event.EventHandler
akceptuje kilka parametrów.
Priority - wskazuje priorytet twojego odbiornika. Istnieje sześć różnych priorytetów, w kolejności wykonania: NAJNIŻSZE, NISKIE, NORMALNE [domyślne], WYSOKA, NAJWYŻSZA, MONITOR. Stałe te odnoszą się do enum org.bukkit.event.EventPriority
.
Jeśli chcesz zmienić wynik wydarzenia, wybierz bardzo ostrożnie od NAJNIŻSZEJ do NAJWYŻSZEJ. Sugerowane uogólnione wtyczki ochronne na LOWEST, bardziej szczegółowe wtyczki na NORMAL i zastępuj wtyczki na HIGH. Jeśli chcesz działać, gdy wydarzenie się wydarzy, ale nie zmieniasz wyniku, użyj MONITORA.
Uwaga: Priorytetu MONITORA należy używać tylko do odczytu. Ten priorytet jest przydatny do rejestrowania wtyczek, aby zobaczyć wyniki zdarzenia, a modyfikowanie wartości może zakłócać działanie tych typów wtyczek.
ignoreCancelled - Wartość logiczna wskazująca, czy Twój detektor powinien odpalić, jeśli zdarzenie zostało anulowane, zanim nadejdzie kolej na jego obsłużenie. Fałsz domyślnie.
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
}
}
Tworzenie niestandardowych zdarzeń
Czasami musisz utworzyć własne wydarzenie, którego inne wtyczki będą mogły słuchać (Vault robi to między innymi), a nawet anulować. Umożliwia to Event API Bukkita. Wszystko, co musisz zrobić, to stworzyć nową klasę, rozszerzyć Event
, dodać moduły obsługi i atrybuty, których potrzebuje Twoje wydarzenie (np. Gracz lub wiadomość).
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;
}
}
Wywoływanie zdarzenia niestandardowego
Masz kontrolę nad tworzeniem i wywoływaniem wydarzeń, a ich wywoływanie zależy wyłącznie od Ciebie. Oto przykład
// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());
Pamiętaj: kontrolujesz swoje wydarzenia. Jeśli nie nazwiesz go i nie będziesz działać zgodnie z nim, tak się nie stanie!
Słuchanie niestandardowego zdarzenia
Słuchanie niestandardowego zdarzenia jest tym samym, co słuchanie zwykłego zdarzenia.
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
}
}
Umożliwianie anulowania CustomEvent
Jeśli kiedykolwiek chcesz, aby twoje wydarzenie było anulowane, po prostu dodaj implements Cancellable
, boolean cancelled
oraz getter i 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;
}
}
Następnie sprawdzisz, czy wtyczka anulowała niestandardowe zdarzenie.
// 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());
}
Cofanie rejestracji wydarzeń lub słuchaczy
Możesz wyrejestrować pojedyncze zdarzenia, całe klasy słuchaczy lub wszystkie zdarzenia zarejestrowane przez Twoją wtyczkę, a nawet inne wtyczki!
Wyrejestruj określone zdarzenie
Każda klasa zdarzeń ma metodę statyczną getHandlerList (), wywołaj ją, a następnie możesz użyć metody .unregister ().
PlayerInteractEvent.getHandlerList().unregister(plugin);
// this will unregister all PlayerInteractEvent instances from the plugin
// you can also specify a listener class instead of plugin.
Teraz już wiesz, dlaczego potrzebujesz funkcji getHandlerList () w niestandardowych zdarzeniach.
Wyrejestruj wszystkie zdarzenia
Za pomocą klasy HandlerList i jej metody statycznej unregisterAll () można łatwo wyrejestrować zdarzenia z klas nasłuchiwania lub wtyczek.
HandlerList.unregisterAll(plugin);
// this will unregister all events from the specified plugin
// you can also specify a listener class instead of plugin.