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

Itu kelas berikut menjelaskan sebuah peristiwa menunjukkan sebuah``pemain``telah datang dalam kontak dengan PATCH dan sekarang untuk tentang bermutasi dengan cara yang ditentukan oleh acara. Sejak itu target acara pemain dan bisa menjadi batal oleh pendengar, itu mengimplementasikan keduanya itu Target peristiwa pemain` dan ``bisa dicegah``antarmuka.

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.Sponge;

PlayerMutationEvent event = new PlayerMutationEvent(victim, PlayerMutationEvent.Mutation.ROTTED_SOCKS,
        Cause.source(flardSource).build());
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 can not combust here, this is a non-smoking area!"));
    }
}