Eventos Personalizados
Puede escribir sus propias clases de evento y enviar esos eventos utilizando el método descrito arriba. Una clase de evento debe extender la clase AbstractEvent, de esta manera implementando el interfaz de Event. Dependiendo de la naturaleza exacta del evento, más interfaces deberian ser implementadas, como Cancellable para eventro que puedan ser cancelado por un escucha o interfaces como TargetPlayerEvent aclarando que tipo de objeto se ve afectado por su evento.
Ejemplo: Clase de Evento Personalizada
The following class describes an event indicating a Player has come in contact with FLARD and is now about to
mutate in a way specified by the event. Since the event targets a player and can be cancelled by listeners, it
implements both the TargetPlayerEvent
and Cancellable
interfaces.
Debido a que generalmente los eventos personalizados están hechos para ser escuchados por otros plug-ins, documentarlos apropiadamente es su mejor apuesta. Esto incluye una lista de objetos típicamente encontrados en Cause. En el ejemplo posterior, probablemente sea mencionado que la causa raíz es generalmente un objeto de la clase ficticia 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;
}
}
Ejemplo: Evento de Fuego Personalizado
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
}
Tenga en mente de que necesita suplir a una causa -no vacía. Si su evento era “Cancelable”, asegúrese de que no haya sido cancelado antes antes de haber ejecutado la acción descripta por el evento.
Ejemplo: Escuchar Evento Personalizado
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!"));
}
}