Événements personnalisés

Vous pouvez écrire vos propres classes d’événements et envoyez ces événements à l’aide de la méthode décrite ci-dessus. Une classe d’événement doit hériter de la classe AbstractEvent, qui implémente donc l’interface Event. Selon la nature exacte de l’événement, plus d’interfaces doivent être implémentées, comme Cancellable pour les événements qui peuvent être annulés par un listener, ou des interfaces comme TargetPlayerEvent clarifiant quelles sortes d’objets sont affectés par votre événement.

Exemple : Classe d’Événement Personnalisée

La classe suivante décrit un événement indiquant qu’un Player est entré en contact avec FLARD et s’apprête à muter d’une manière spécifiée par l’événement. Étant donné que l’événement cible un joueur et peut être annulé par les listeners, il implémente les deux interfaces TargetPlayerEvent et Cancellable.

Puisque les événements personnalisés sont généralement destinés à être écoutés par les autres plugins, c’est dans votre intérêt de les documenter adéquatement. Cela inclut une liste d’objets généralement trouvés dans la Cause. Dans l’exemple ci-dessous, il serait probablement mentionné que la cause principale est généralement un objet de la classe fictive FLARDSource.

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Cancellable;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.entity.living.humanoid.player.TargetPlayerEvent;
import org.spongepowered.api.event.impl.AbstractEvent;

public class PlayerMutationEvent extends AbstractEvent implements TargetPlayerEvent, Cancellable {

    public enum Mutation {
        COMPULSIVE_POETRY,
        ROTTED_SOCKS,
        SPONTANEOUS_COMBUSTION;
    };

    private final Cause cause;
    private final Player victim;
    private final Mutation mutation;
    private boolean cancelled = false;

    public PlayerMutationEvent(Player victim, Mutation mutation, Cause cause) {
        this.victim = victim;
        this.mutation = mutation;
        this.cause = cause;
    }

    public Mutation getMutation() {
        return this.mutation;
    }

    @Override
    public boolean isCancelled() {
        return this.cancelled;
    }

    @Override
    public void setCancelled(boolean cancel) {
        this.cancelled = cancel;
    }

    @Override
    public Cause getCause() {
        return this.cause;
    }

    @Override
    public Player getTargetEntity() {
        return this.victim;
    }

}

Exemple : Déclencher l’Événement Personnalisé

import org.spongepowered.api.Sponge;

PlayerMutationEvent event = new PlayerMutationEvent(victim, PlayerMutationEvent.Mutation.ROTTED_SOCKS,
        Cause.source(flardSource).build());
Sponge.getEventManager().post(event);
if (!event.isCancelled()) {
    // Mutation code
}

N’oubliez pas que vous devez fournir une cause non vide. Si votre événement était un Cancellable, assurez-vous qu’il n’était pas annulé avant d’effectuer l’action décrite par l’événement.

Exemple : Enregistrer les Événements Personnalisés

import org.spongepowered.api.event.Listener;
import org.spongepowered.api.text.Text;

@Listener
public void onPrivateMessage(PlayerMutationEvent event) {
    if(event.getMutation() == PlayerMutationEvent.Mutation.SPONTANEOUS_COMBUSTION) {
        event.setCancelled(true);
        event.getTargetEntity().sendMessage(Text.of("You can not combust here, this is a non-smoking area!"));
    }
}