bukkit
Handhabung des Events
Suche…
Einführung
Wenn in Bukkit etwas passiert, wird ein Event aufgerufen, damit jedes Plugin entscheiden kann, was zu tun ist, wenn etwas passiert.
Ein Ereignis wird aufgerufen, wenn ein Spieler versucht, einen Block abzuspielen, wenn eine Entität abbricht, wenn sich jemand anmeldet ... Plugins können bestimmte Ereignisse abhören und auf verschiedene Arten behandeln, z Ein Spieler meldet sich über das PlayerLoginEvent an.
Syntax
- Bukkit.getPluginManager (). RegisterEvents (Listener l, Plugin p);
Bemerkungen
Prüfen Sie bei der Registrierung eines Ereignisses, ob Sie es nicht zweimal registrieren. Oder Ihr Plugin wird für das registrierte Ereignis zweimal wirken.
Schauen Sie sich extra an, wie Sie mit bestimmten Ereignissen umgehen:
Registrieren Sie Ereignisse in der Listener-Klasse
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);
}
}
Ereignisse in Ihrer Hauptklasse registrieren
public class Main extends JavaPlugin {
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler
public void yourEvent(Event e) {
//...
}
}
Ereignisse hören
Bukkit verwendet ein ereignisbasiertes System, mit dem Plugin-Entwickler mit dem Server und bestimmten Aktionen in der Welt interagieren und diese ändern können.
Erstellen eines Ereignishandlers
Event-Handler sind Methoden, die aufgerufen werden, wenn ihr Ereignis eintritt. Sie sind im Allgemeinen öffentlich und nichtig und werden on{EventNameStem}
nach Konvention benannt. Alle Handler müssen jedoch die @EventHandler
Annotation sowie das Ereignis als Parameter ONLY enthalten. Hier ist ein Beispiel für einen Event-Handler für das PlayerJoinEvent
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
Hinweis: Das Namensformat für Bukkit-Ereignisse lautet {Source}{Action}({Target})Event
. Einige Beispiele für diese Ereignisnamen sind: PlayerInteractEvent
oder BlockBreakEvent
oder PlayerJoinEvent
. Eine Liste aller Ereignisse finden Sie in den Spigot-Javadocs
Ereignisse registrieren
Das Erstellen eines Ereignishandlers reicht nicht aus, um Bukkit das Senden von Ereignisaufrufen an Ihre Methode zu ermöglichen. Sie müssen es auch über die PluginManager-Benutzeroberfläche registrieren.
Die gebräuchlichste Methode zum Registrieren von Ereignissen ist das Erstellen einer Klasse, die die Listener-Schnittstelle implementiert, und die Event-Handler damit umschließen.
public class EventListener implements Listener { //Implements the Listener interface
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
}
Diese Listener-Klasse und alle ihre Ereignisse können dann wie folgt in Ihrer Haupt-Plugin-Klasse registriert werden:
@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}
Benutzerdefinierte Ereignisse erstellen
Manchmal müssen Sie ein eigenes Ereignis erstellen, das andere Plugins anhören können (unter anderem auch Vault), und dies sogar abbrechen. Bukkits Event-API ermöglicht dies. Sie müssen lediglich eine neue Klasse erstellen, Event
, die Handler und die Attribute hinzufügen, die Ihr Ereignis benötigt (wie Player oder Nachricht).
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;
}
}
Ihr individuelles Ereignis anrufen
Sie haben die Kontrolle über das Erstellen und Aufrufen von Ereignissen, bei denen Sie es selbst aufrufen. Hier ist ein Beispiel
// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());
Denken Sie daran: Sie haben die Kontrolle über Ihre Ereignisse. Wenn Sie es nicht anrufen und danach handeln, passiert es nicht!
Anpassen eines benutzerdefinierten Ereignisses
Das Anhören eines benutzerdefinierten Ereignisses entspricht dem Abhören eines normalen Ereignisses.
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
}
}
So machen Sie Ihr CustomEvent kündbar
Wenn Sie Ihre Veranstaltung jemals boolean cancelled
machen möchten, fügen Sie einfach implements Cancellable
, boolean cancelled
implements Cancellable
und einen Getter und Setter hinzu:
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;
}
}
Anschließend prüfen Sie, ob ein Plugin das benutzerdefinierte Ereignis abgebrochen hat.
// 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());
}
Grundlegende Ereignisbehandlung
Bukkit verwendet ein ereignisbasiertes System, mit dem Plugin-Entwickler mit dem Server und bestimmten Aktionen in der Welt interagieren und diese ändern können.
Erstellen eines Ereignishandlers
Event-Handler sind Methoden, die aufgerufen werden, wenn ihr Ereignis eintritt. Sie sind im Allgemeinen öffentlich und nichtig und werden on{EventNameStem}
nach Konvention benannt. Alle Handler müssen jedoch die @EventHandler
Annotation sowie das Ereignis als Parameter ONLY enthalten. Hier ist ein Beispiel für einen Event-Handler für das PlayerJoinEvent
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
Hinweis: Das Namensformat für Bukkit-Ereignisse lautet {Source}{Action}({Target})Event
. Einige Beispiele für diese Ereignisnamen sind: PlayerInteractEvent
oder BlockBreakEvent
oder PlayerJoinEvent
. Eine Liste aller Ereignisse finden Sie in den Spigot-Javadocs
Ereignisse registrieren
Das Erstellen eines Ereignishandlers reicht nicht aus, um Bukkit das Senden von Ereignisaufrufen an Ihre Methode zu ermöglichen. Sie müssen es auch über die PluginManager-Benutzeroberfläche registrieren.
Die gebräuchlichste Methode zum Registrieren von Ereignissen ist das Erstellen einer Klasse, die die Listener-Schnittstelle implementiert, und die Event-Handler damit umschließen.
public class EventListener implements Listener { //Implements the Listener interface
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
//Run when a player joins
}
}
Diese Listener-Klasse und alle ihre Ereignisse können dann wie folgt in Ihrer Haupt-Plugin-Klasse registriert werden:
@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}
Ereignisprioritäten
Bukkit verfügt über ein System mit dem Namen Ereignisprioritäten , das Plugins dabei unterstützt, Ereignisse im korrekten älteren zu behandeln. Die sieben Prioritäten sind (in älteren von der ersten bis zur letzten Ausführung):
- Niedrigste
- Niedrig
- Normal (Standard)
- Hoch
- Höchste
- Monitor
Wenn Sie planen, viele Ereignisse abzubrechen (z. B. ein Schutz-Plugin), empfiehlt es sich, eine niedrigere Priorität (oder niedrigste Priorität) zu verwenden, um Probleme zu vermeiden.
Sie sollten das Ergebnis einer Veranstaltung bei MONITOR niemals ändern.
@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
}
Mehr Info: