bukkit
Obsługa zdarzeń
Szukaj…
Wprowadzenie
Gdy coś dzieje się w Bukkicie, wywoływane jest Wydarzenie, dzięki czemu każda wtyczka może zdecydować, co zrobić, gdy coś się wydarzy.
Zdarzenie jest wywoływane, gdy gracz próbuje zagrać w blok, gdy istota znika, gdy ktoś się loguje ... Wtyczki mogą słuchać określonych zdarzeń i radzić sobie z nimi na wiele różnych sposobów, na przykład wysyłając wiadomość do administratora, gdy Gracz loguje się za pośrednictwem PlayerLoginEvent.
Składnia
- Bukkit.getPluginManager (). RegisterEvents (Listener l, Plugin p);
Uwagi
Rejestrując wydarzenie, sprawdź, czy nie rejestrujesz go dwukrotnie! Lub twoja wtyczka będzie działać dwukrotnie dla zarejestrowanego wydarzenia.
Przyjrzyj się, jak obsługiwać określone zdarzenia:
Zarejestruj zdarzenia w klasie Listener
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class MyEventListener implements Listener {
/**
* Constructor
*/
public MyEventListener(Main plugin){
//register Events of this class
//with methode: registerEvents(Listener, Plugin);
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* A Event with HIGH priority
*/
@EventHandler(priority = EventPriority.HIGH) //An EventHandler annotation
public void onPlayerLogin(PlayerLoginEvent event){ //A bukkit event
event.getPlayer().sendMessage("Welcome.");
}
/**
* A Event with NORMAL (default) priority
*/
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event){
Bukkit.broadcastMessage(event.getPlayer().getName() + " left the Server.");
}
}
/**
* Main class
*/
public class Main extends JavaPlugin {
public void onEnable(){
//Register Events
new MyEventListener(this);
}
}
Rejestrowanie wydarzeń w klasie głównej
public class Main extends JavaPlugin {
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler
public void yourEvent(Event e) {
//...
}
}
Słuchanie wydarzeń
Bukkit korzysta z systemu opartego na zdarzeniach, który umożliwia programistom wtyczek interakcję z serwerem i modyfikowanie go oraz określonych działań na świecie.
Tworzenie modułu obsługi zdarzeń
Procedury obsługi zdarzeń to metody wywoływane po wystąpieniu zdarzenia. Są one na ogół publiczne i nieważne, a także on{EventNameStem}
nazywane on{EventNameStem}
. Wszystkie @EventHandler
obsługi muszą jednak mieć adnotację @EventHandler
, a także zawierać swoje zdarzenie jako parametr TYLKO. Oto przykład procedury obsługi zdarzeń dla PlayerJoinEvent
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
Uwaga: format nazewnictwa dla zdarzeń Bukkit to zdarzenie {Source}{Action}({Target})Event
. Niektóre przykłady takich nazw zdarzeń to: PlayerInteractEvent
lub BlockBreakEvent
lub PlayerJoinEvent
. Lista wszystkich zdarzeń znajduje się na Spadot Javadocs
Rejestracja zdarzeń
Samo utworzenie modułu obsługi zdarzeń nie wystarczy, aby Bukkit mógł rozpocząć wysyłanie wywołań zdarzeń do metody. Musisz go również zarejestrować za pomocą interfejsu PluginManager.
Najczęstszym sposobem rejestrowania zdarzeń jest utworzenie klasy, która implementuje interfejs Listener i użycie go do zawarcia obsługi zdarzeń.
public class EventListener implements Listener { //Implements the Listener interface
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
}
Tę klasę nasłuchiwania i wszystkie jej zdarzenia można następnie zarejestrować w głównej klasie wtyczek w następujący sposób:
@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}
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());
}
Podstawowa obsługa zdarzeń
Bukkit korzysta z systemu opartego na zdarzeniach, który umożliwia programistom wtyczek interakcję z serwerem i modyfikowanie go oraz określonych działań na świecie.
Tworzenie modułu obsługi zdarzeń
Procedury obsługi zdarzeń to metody wywoływane po wystąpieniu zdarzenia. Są one na ogół publiczne i nieważne, a także on{EventNameStem}
nazywane on{EventNameStem}
. Wszystkie @EventHandler
obsługi muszą jednak mieć adnotację @EventHandler
, a także zawierać swoje zdarzenie jako parametr TYLKO. Oto przykład procedury obsługi zdarzeń dla PlayerJoinEvent
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
Uwaga: format nazewnictwa dla zdarzeń Bukkit to zdarzenie {Source}{Action}({Target})Event
. Niektóre przykłady takich nazw zdarzeń to: PlayerInteractEvent
lub BlockBreakEvent
lub PlayerJoinEvent
. Lista wszystkich zdarzeń znajduje się na Spadot Javadocs
Rejestracja zdarzeń
Samo utworzenie modułu obsługi zdarzeń nie wystarczy, aby Bukkit mógł rozpocząć wysyłanie wywołań zdarzeń do metody. Musisz go również zarejestrować za pomocą interfejsu PluginManager.
Najczęstszym sposobem rejestrowania zdarzeń jest utworzenie klasy, która implementuje interfejs Listener i użycie go do zawarcia obsługi zdarzeń.
public class EventListener implements Listener { //Implements the Listener interface
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
}
Tę klasę nasłuchiwania i wszystkie jej zdarzenia można następnie zarejestrować w głównej klasie wtyczek w następujący sposób:
@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}
Priorytety zdarzeń
Bukkit ma system o nazwie Priorytety zdarzeń, który pomaga wtyczkom obsługiwać zdarzenia we właściwej starszej wersji. Siedem priorytetów (starszych od pierwszego do ostatniego):
- Najniższy
- Niska
- Normalny (domyślny)
- Wysoki
- Najwyższy
- Monitor
Jeśli planujesz anulować wiele wydarzeń (np. Wtyczkę ochronną), dobrym pomysłem byłoby użycie niższego priorytetu (lub najniższego), aby uniknąć problemów.
Nigdy nie należy modyfikować wyniku wydarzenia w MONITOR.
@EventHandler //same as @EventHandler(priority = EventPriority.NORMAL)
public void onLogin(PlayerLoginEvent event) {
// normal login
}
@EventHandler(priority = EventPriority.HIGH)
public void onLogin(PlayerLoginEvent event) {
// high login
}
Więcej informacji: