minecraft
Ascoltatori di eventi in Bukkit
Ricerca…
Creare un listener di eventi
Per registrare i tuoi metodi, la classe contenente EventHandler deve implementare l'interfaccia Listener.
import org.bukkit.event.Listener;
public final class ListenerClass implements Listener {
}
È necessario registrare il listener di eventi aggiungendo la seguente chiamata al metodo onEnable nella classe che estende JavaPlugin:
getServer().getPluginManager().registerEvents(new ListenerClass(), this);
Per ascoltare un determinato evento nella classe del listener, è necessario creare un metodo con l'annotazione @EventHandler sul metodo. Il tipo di evento è specificato dal tipo nel solo argomento del metodo. Il metodo può essere nominato come desideri.
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!");
}
}
Parametri EventHandler
L'annotazione org.bukkit.event.EventHandler
accetta un paio di parametri.
priorità : indica la priorità dell'ascoltatore. Vi sono le sei diverse priorità, in ordine di esecuzione: LOWEST, LOW, NORMAL [default], HIGH, HIGHEST, MONITOR. Queste costanti si riferiscono org.bukkit.event.EventPriority
.
Se si desidera modificare l'esito di un evento, scegliere con molta attenzione da MINIMO a PIÙ ALTO. Plugin di protezione generalizzati consigliati su LOWEST, plugin più specifici su NORMAL e override di plugin su HIGH. Se si desidera agire quando si verifica un evento, ma non modificare il risultato, utilizzare MONITOR.
Nota: la priorità MONITOR deve essere utilizzata solo per la sola lettura. Questa priorità è utile per registrare i plug-in per vedere i risultati di un evento e modificare i valori può interferire con questi tipi di plug-in.
ignoreCancelled - Un valore booleano che indica se l'ascoltatore deve o meno sparare se l'evento è stato cancellato prima che sia il turno dell'ascoltatore di gestire l'evento. Falso per impostazione predefinita.
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
}
}
Creazione di eventi personalizzati
A volte hai bisogno di creare il tuo Evento, quello che altri plugin possono ascoltare (Vault, tra gli altri plugin, lo fa) e persino annullare. L'API Event di Bukkit consente questo di essere possibile. Tutto quello che devi fare è creare una nuova classe, farla estendere Event
, aggiungere i gestori e gli attributi di cui ha bisogno l'evento (come Player o messaggio).
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;
}
}
Chiamando il tuo evento personalizzato
Hai il controllo della creazione e della chiamata dei tuoi eventi, dove la chiami dipende interamente da te. Ecco un esempio
// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());
Ricorda: hai il controllo dei tuoi eventi. Se non lo chiami e agisci su di esso, non succede!
Ascoltare un evento personalizzato
Ascoltare un evento personalizzato è come ascoltare un evento normale.
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
}
}
Rendi il tuo CustomEvent cancellabile
Se vuoi rendere cancellabile il tuo evento, aggiungi solo implements Cancellable
, boolean cancelled
e un getter and 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;
}
}
In seguito, verificherai se un plug-in ha annullato l'evento personalizzato.
// 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());
}
Eventi o ascoltatori non registrati
Puoi annullare la registrazione di singoli eventi, intere classi di ascoltatori o di tutti gli eventi registrati dal tuo plugin o anche da altri plugin!
Annulla la registrazione di un evento specifico
Ogni classe di eventi ha il metodo statico getHandlerList (), chiamalo e quindi puoi usare il metodo .unregister ().
PlayerInteractEvent.getHandlerList().unregister(plugin);
// this will unregister all PlayerInteractEvent instances from the plugin
// you can also specify a listener class instead of plugin.
Ora sai perché avrai bisogno di getHandlerList () nei tuoi eventi personalizzati.
Annulla la registrazione di tutti gli eventi
Usando la classe HandlerList e il suo metodo statico unregisterAll () puoi facilmente annullare la registrazione degli eventi dalle classi o plug-in del listener.
HandlerList.unregisterAll(plugin);
// this will unregister all events from the specified plugin
// you can also specify a listener class instead of plugin.