Acara Khusus

Anda bisa menulis sendiri acara kelas dan kirimkan kejadian tersebut dengan menggunakan metode yang dijelaskan di atas. Acara kelas itu harus diperluaskan :javadoc:`peristiwa abstrak`kelas, demikian itu menerapkan :javadoc:`peristiwa`antarmuka. Tergantung pada sifat acara dari peristiwa, lebih bagus antarmuka menjadi diimplementasikan, suka :javadoc:`bisa dicegah`untuk acara itu bisa dibatalkan oleh seorang pendengar atau antar muka seperti :javadoc:`Target pemain peristiwa`klarifikasi seperti apa dari objek anda dipengaruhi oleh acara.

Contoh: adat kelas acara peristiwa

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.

Karena umumnya acara khusus dimaksudkan untuk didengarkan oleh plugin lain, sangat penting untuk mendokumentasikannya dengan tepat. Ini termasuk daftar objek yang biasanya ditemukan di :javadoc:`Penyebab`. Dalam contoh di bawah ini, mungkin akan disebutkan bahwa akar masalahnya pada umumnya adalah objek kelas SumberFLARD kelas.

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;
    }

}

Contoh: Acara Khusus Kebakaran

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
}

Ingatlah bahwa Anda perlu menyediakan penyebab yang tidak kosong. Jika acara Anda `` Bisa dicegah``, pastikan tidak dibatalkan sebelum melakukan tindakan yang dijelaskan oleh acara.

Contoh: Dengarkan Peristiwa Khusus

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!"));
    }
}