Les Event Listeners

Dans le but d’écouter un événement, un event listener doit être inscrit. Cela se fait en créant une méthode, peu importe son nom, ayant pour premier (et seul) paramètre le type de l’événement désiré, et en apposant l’annotation Listener à la méthode, comme illustré ci-dessous.

import org.spongepowered.api.event.Listener;

@Listener
public void onSomeEvent(SomeEvent event) {
    // Do something with the event
}

En plus, la classe contenant ces méthodes doit être inscrite auprès du gestionnaire d’événements:

Astuce

Pour les event listeners présents dans la classe principale de votre plugin (annotée par Plugin), vous n’avez pas besoin d’inscrire son instance car Sponge le fera déjà automatiquement.

Note

The event bus supports supertypes. For example, ChangeBlockEvent.All extends ChangeBlockEvent. Therefore, a plugin could listen to ChangeBlockEvent and still receive ChangeBlockEvent.Alls. However, a plugin listening to just ChangeBlockEvent.All would not be notified of other types of ChangeBlockEvent.

Inscription et Désinscription des Event Listeners

To register event listeners annotated by @Listener that are not in the main plugin class, you can use EventManager#registerListeners(PluginContainer, Object), which accepts a reference to the plugin and an instance of the class containing the event listeners.

Exemple: Inscription des Event Listeners dans d’autres classes

import org.spongepowered.api.Sponge;

public class ExampleListener {

    @Listener
    public void onSomeEvent(SomeEvent event) {
        // Do something with the event
    }
}

Sponge.eventManager().registerListeners(this, new ExampleListener());

Inscription dynamique des Event Listeners

Certains plugins (comme les plugins de scripting) peuvent avoir besoin d’inscrire un event listener dynamiquement. Dans ce cas, l’event listener n’est pas une méthode annotée de @Listener, mais une classe implémentant l’interface EventListener. Cet event listener peut ensuite être inscrit avec la méthode EventManager#registerListener, qui prend en paramètres, dans l’ordre: une référence au plugin, sa Class, et le listener lui-même. Optionnellement, vous pouvez spécifier un ordre Order d’exécution en troisième paramètre (avant l’instance du listener), ou un booléen en quatrième argument qui déterminera s’il faut appeler le listener avant ou bien après toute modification effectuée par le serveur.

Exemple: Implémenter l’interface EventListerner

import org.spongepowered.api.event.EventListener;
import org.spongepowered.api.event.block.ChangeBlockEvent;

public class ExampleListener implements EventListener<ChangeBlockEvent.All> {

    @Override
    public void handle(ChangeBlockEvent.Break event) throws Exception {
        [...]
    }
}

Exemple: Inscription dynamique de l’Event Listener

EventListener<ChangeBlockEvent.All> listener = new ExampleListener();
EventListenerRegistration registeration = EventListenerRegistration
    .builder(ChangeBlockEvent.All.class)
    .listener(listener)
    .plugin(pluginContainer)
    .build();
Sponge.eventManager().registerListener(registeration);

Astuce

Pour les event listeners créés via l’annotation @Listener, l’ordre d’exécution peut être configuré (voir aussi About @Listener). Pour les listeners inscrits dynamiquement cela est possible en passant à la méthode EventManager#registerListener un Order en troisième paramètre.

Désinscription des Event Listeners

Pour désinscrire un seul event listener, vous pouvez utiliser la méthode EventManager#unregisterListeners(Object), qui prend en paramètre une instance de la classe contenant les event listeners.

EventListener listener = ...;
Sponge.getEventManager().unregisterListeners(listener);

Alternativement, vous pouvez utiliser la méthode EventManager#unregisterPluginListeners(Object), en passant en paramètre une instance du plugin, pour désinscrire tous les events listeners qui lui sont associés. Notez que cela inclue ceux inscrits via les annotations @Listener.

PluginContainer plugin = ...;
Sponge.eventManager().unregisterListeners(plugin);

A propos de @Listener

L’annotation @Listener a quelques champs configurables:

  • order est l’ordre dans lequel l’event listener doit être exécuté. Voir l’énumération Order de SpongeAPI pour voir les options disponibles.

  • beforeModifications spécifie si l’event listener doit être appelé avant les autres mods serveur, tels que les mods Forge. Par défaut, il est défini sur false.

Par défaut, l’annotation @Listener est configurée de manière à ce que l’event listener ne soit pas appelé si l’événement en question est annulable et a été annulé (par un autre plugin, par exemple).

RefreshGameEvent

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 refresh actions. What constitutes as a “refresh action” is purely up to the plugin to decide. The RefreshGameEvent will fire when a player executes the /sponge plugins refresh command. The event is not necessarily limited to reloading configuration.

import org.spongepowered.api.event.lifecycle.RefreshGameEvent;

@Listener
public void refresh(GameRefreshEvent event) {
    // Do refresh stuff
}

Notez que c’est différent de ce qui est généralement considéré “reload”, puisque l’événement est purement une fonction de rappel (Callback) pour les plugins et ne fait lui-même aucun rechargement.

Déclenchement d’Événements

Pour envoyer un événement, vous avez besoin d’un objet qui implémente l’interface Event.

Vous pouvez déclencher des événements en utilisant le bus d’événements (EventManager):

boolean cancelled = Sponge.eventManager().post(theEventObject);

La méthode retourne true si l’événement a été annulé, false sinon.