Detectores de Eventos
Con el fin de detectar un evento, un detector de evento debe ser registrado. Esto se hace realizando un método con cualquier nombre, definiendo el primer parámetro para ser el tipo de evento deseado y luego fijando la anotación :javadoc:`Detector` al método, es mostrado a continuación.
import org.spongepowered.api.event.Listener;
@Listener
public void onSomeEvent(SomeEvent event) {
// Do something with the event
}
Adicionalmente, la clase que contiene estos métodos debe ser registrada con el administrador de evento:
Truco
Para detectores de eventos en su clase de complemento principal (anotada por Plugin), no necesita registrar el objeto para eventos ya que Sponge lo hará automáticamente.
Nota
El bus de evento admite supertipos. Por ejemplo, ChangeBlockEvent.Break se extiende de ChangeBlockEvent. Por lo tanto, un complemento podría detectar ChangeBlockEvent
y todavía recibir ChangeBlockEvent.Break
s. Sin embargo, un plugin que solo detecta ChangeBlockEvent.Break
no sería notificado de otros tipos de ChangeBlockEvent
.
Registro y Anulación de Registro de Detectores de Evento
Para registrar detectores de evento anotados por @Listener
que no están en la clase de complemento principal, puede utilizar EventManager#registerListeners(Object, Object), que acepta una referencia al complemento y una instancia de la clase que contiene los detectores de eventos.
Ejemplo: Registro de Detectores de Eventos en Otras Clases
import org.spongepowered.api.Sponge;
public class ExampleListener {
@Listener
public void onSomeEvent(SomeEvent event) {
// Do something with the event
}
}
Sponge.getEventManager().registerListeners(this, new ExampleListener());
Registrar Dinámicamente Detectores de Eventos
Algunos complementos (como los complementos de scripting) pueden desear registrar dinámicamente un detector de eventos. En ese caso, el detector de eventos no es un método anotado con @Listener
, sino más bien una clase que implementa la interfaz EventListener
. Este detector de eventos puede luego ser registrado llamando a EventManager#registerListener
, que acepta una referencia al complemento como el primer argumento, la `` Clase`` de eventos manejados como el segundo argumento y el propio detector como el argumento final. Opcionalmente, puede especificar un :javadoc:`Orden` para ejecutar el detector de eventos como el tercer argumento o un valor boolean como el cuarto argumento (antes de la instancia del detector) que determina si se debe llamar al detector antes de otras modificaciones del servidor.
Ejemplo: Implementación de EventListener
import org.spongepowered.api.event.EventListener;
import org.spongepowered.api.event.block.ChangeBlockEvent;
public class ExampleListener implements EventListener<ChangeBlockEvent.Break> {
@Override
public void handle(ChangeBlockEvent.Break event) throws Exception {
[...]
}
}
Ejemplo: Registrar Dinámicamente el Detector de Eventos
EventListener<ChangeBlockEvent.Break> listener = new ExampleListener();
Sponge.getEventManager().registerListener(this, ChangeBlockEvent.Break.class, listener);
Truco
Para detectores de eventos creados con la anotación @Listener
, el orden de la ejecución puede ser configurado (vea también About @Listener). Para registrar dinámicamente detectores de eventos, esto es posible al pasar un Orden
al tercer argumento del método EventManager#registerListener
.
Anulación de Registro de Detectores de Eventos
Para anular el registro de un único detector de eventos, puede utilizar el método EventManager#unregisterListeners(Object), que acepta una instancia de la clase que contiene los detectores de eventos.
EventListener listener = ...;
Sponge.getEventManager().unregisterListeners(listener);
Alternativamente, puede utilizar EventManager#unregisterPluginListeners(Object), pasando una referencia al complemento, para anular el registro todos los detectores de eventos asociados con ese complemento. Tenga en cuenta que esto eliminará todos los detectores de eventos de plugin, incluyendo esos registros con anotaciones @Listener
.
PluginContainer plugin = ...;
Sponge.getEventManager().unregisterPluginListeners(plugin);
Acerca de @Listener
La anotación @Listener
tiene unos pocos campos configurables:
order
is the priority in which the event listener is to be run. See the Order enum in SpongeAPI to see the available options.beforeModifications
especifica si el detector de evento debería ser llamado antes de otras modificaciones del servidor, como modificaciones de Forge. Por defecto, esto es establecido como falso.
Por defecto, @Listener
es configurado así que su detector de eventos no será llamado si el evento en cuestión es cancelable y ha sido cancelado (como por otro complemento).
GameReloadEvent
To prevent all plugins providing their own reload commands, Sponge provides a built-in callback for plugins to listen
to, and when executed, perform any reloading actions. What constitutes as a “reloading action” is purely up to the
plugin to decide. The GameReloadEvent will fire when a player executes the
/sponge plugins reload
command. The event is not necessarily limited to reloading configuration.
import org.spongepowered.api.event.game.GameReloadEvent;
@Listener
public void reload(GameReloadEvent event) {
// Do reload stuff
}
Tenga en cuenta que esto es diferente de lo que generalmente es considerado una “recarga”, ya que el evento es puramente de retrollamada y no realiza ninguna recarga por sí misma.
Disparar Eventos
Para enviar un evento, necesita un objeto que implemente la interfaz :javadoc:`Evento`.
Puede disparar eventos utilizando el bus de evento (EventManager):
boolean cancelled = Sponge.getEventManager().post(theEventObject);
El método devuelve verdadero
si el evento fue cancelado, falso
si no es así.
Disparar Eventos de Sponge
Es posible generar instancias de eventos incorporados con la SpongeEventFactory
estática. Esta clase es generada automáticamente por lo que no hay Javadocs. Utilice la autocompletación de su IDE para listar los métodos existentes. Los eventos creados por la SpongeEventFactory
son pasados luego al EventManager#post(Event).
Ejemplo: Disparar el LightningEvent
import org.spongepowered.api.event.action.LightningEvent;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.event.SpongeEventFactory;
PluginContainer plugin = ...;
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();
LightningEvent lightningEvent = SpongeEventFactory.createLightningEventPre(Cause.of(eventContext, plugin));
Sponge.getEventManager().post(lightningEvent);
Advertencia
Una :javadoc:`Causa` nunca puede estar vacía. Por lo menos debe incluir el contenedor de su complemento.