É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.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.Sponge;
PluginContainer plugin = ...;
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();
PlayerMutationEvent event = new PlayerMutationEvent(victim, PlayerMutationEvent.Mutation.ROTTED_SOCKS,
Cause.of(eventContext, plugin));
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 cannot combust here, this is a non-smoking area!"));
}
}