minecraft
Escuchas de eventos en Bukkit
Buscar..
Creando un detector de eventos
Para registrar sus métodos, la clase que contiene el EventHandler (s) debe implementar la interfaz de escucha.
import org.bukkit.event.Listener;
public final class ListenerClass implements Listener {
}
Debe registrar el detector de eventos agregando la siguiente llamada a su método onEnable en la clase que extiende JavaPlugin:
getServer().getPluginManager().registerEvents(new ListenerClass(), this);
Para escuchar cualquier evento dado en su clase de oyente, debe crear un método con la anotación @EventHandler en el método. El tipo de evento es especificado por el Tipo en el único argumento del método. El método puede ser nombrado como quieras.
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!");
}
}
Parámetros de EventHandler
La anotación org.bukkit.event.EventHandler
acepta un par de parámetros.
prioridad : indica la prioridad de su oyente. Existen seis prioridades diferentes, en orden de ejecución: LOWEST, LOW, NORMAL [predeterminado], HIGH, HIGHEST, MONITOR. Estas constantes se refieren a la enumeración org.bukkit.event.EventPriority
.
Si desea cambiar el resultado de un evento, elija con mucho cuidado desde el MÁS BAJO hasta el MÁS ALTO. Se sugieren complementos de protección generalizada en LOWEST, complementos más específicos en NORMAL y anulación de complementos en ALTO. Si desea actuar cuando ocurre un evento, pero no cambiar el resultado, use MONITOR.
Nota: La prioridad de MONITOR solo debe usarse para lectura. Esta prioridad es útil para el registro de complementos para ver los resultados de un evento y la modificación de valores puede interferir con esos tipos de complementos.
ignoreCancelled : un valor booleano que indica si su oyente debe disparar si el evento se ha cancelado antes de que sea el turno del oyente para manejar el evento. Falso por defecto.
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
}
}
Creación de eventos personalizados
A veces necesitas crear tu propio evento, uno que otros complementos puedan escuchar (Vault, entre otros complementos, hace esto) e incluso cancelar. La API de eventos de Bukkit permite que esto sea posible. Todo lo que necesita hacer es crear una nueva clase, extender el Event
, agregar los controladores y los atributos que su evento necesita (como Jugador o mensaje).
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;
}
}
Llamando a tu evento personalizado
Usted tiene el control de crear y llamar a sus eventos, donde lo llame, depende completamente de usted. Aquí un ejemplo
// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());
Recuerda: tienes el control de tus eventos. Si no lo llamas, y actúas sobre él, ¡no sucede!
Escuchando un evento personalizado
Escuchar un evento personalizado es lo mismo que escuchar un evento normal.
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
}
}
Haciendo su CustomEvent Cancellable
Si alguna vez desea que su evento sea boolean cancelled
, solo agregue implements Cancellable
, boolean cancelled
y un captador y configurador:
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;
}
}
Luego, verificará si un complemento canceló el evento personalizado.
// 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());
}
Anular el registro de eventos u oyentes
Puede anular el registro de eventos individuales, clases de oyentes completas o todos los eventos registrados por su complemento o incluso por otros complementos.
Anular registro de evento específico
Cada clase de evento tiene el método estático getHandlerList (), llámelo y luego puede usar el método .unregister ().
PlayerInteractEvent.getHandlerList().unregister(plugin);
// this will unregister all PlayerInteractEvent instances from the plugin
// you can also specify a listener class instead of plugin.
Ahora sabes por qué necesitarás getHandlerList () en tus eventos personalizados.
Anular el registro de todos los eventos
Usando la clase HandlerList y su método estático unregisterAll (), puede cancelar fácilmente el registro de eventos de clases de escuchas o complementos.
HandlerList.unregisterAll(plugin);
// this will unregister all events from the specified plugin
// you can also specify a listener class instead of plugin.