Acara Pendengar

Dalam rangka untuk mendengarkan sebuah acara, event listener harus didaftarkan. Hal ini dilakukan dengan membuat method dengan nama apapun, mendefinisikan parameter pertama untuk menjadi yang diinginkan, jenis acara, dan kemudian pembubuhan :javadoc:`Pendengar` penjelasan untuk metode, seperti yang digambarkan di bawah ini.

import org.spongepowered.api.event.Listener;

@Listener
public void onSomeEvent(SomeEvent event) {
    // Do something with the event
}

Selain itu, kelas yang berisi metode-metode ini harus didaftarkan kepada manajer acara:

Tip

Untuk acara pendengar pada plugin utama kelas (annotated oleh Plugin), anda tidak perlu untuk mendaftarkan objek untuk acara-acara seperti Spons yang akan melakukannya secara otomatis.

Catatan

Acara bis mendukung supertypes. Misalnya, ChangeBlockEvent.Break meluas ChangeBlockEvent. Oleh karena itu, sebuah plugin yang bisa mendengarkan ChangeBlockEvent dan masih menerima ChangeBlockEvent.Istirahats. Namun, sebuah plugin yang mendengarkan hanya ChangeBlockEvent.Break tidak akan diberitahu tentang jenis lain dari ChangeBlockEvent.

Mendaftar dan Tidak mendaftar Acara Pendengar

Untuk mendaftar acara ini pendengar dijelaskan oleh @Listener yang tidak di plugin utama kelas, anda dapat menggunakan EventManager#registerListeners(Objek, Objek), yang menerima referensi untuk plugin dan sebuah instance dari kelas yang mengisi acara pendengar.

Contoh: Mendaftar Acara Pendengar di kelas-Kelas Lain

import org.spongepowered.api.Sponge;

public class ExampleListener {

    @Listener
    public void onSomeEvent(SomeEvent event) {
        // Do something with the event
    }
}

Sponge.getEventManager().registerListeners(this, new ExampleListener());

Mendaftar Acara Pendengar Secara Dinamis

Beberapa plugin (seperti skrip plugin) mungkin ingin meregistrasi pendengar acara. Dalam hal bahwa pendengar acara ini bukan metode yang dijelaskan dengan @Listener, melainkan kelas yang menerapkan EventListener antarmuka. Acara ini pendengar kemudian dapat didaftarkan dengan memanggil EventManager#registerListener, yang menerima referensi untuk plugin sebagai argumen pertama, ada Class peristiwa ditangani sebagai argumen kedua, dan pendengar itu sendiri sebagai argumen akhir. Opsional, anda dapat menentukan :javadoc:` Order`untuk menjalankan event listener di ketiga argumen atau nilai boolean sebagai argumen keempat (sebelum contoh dari pendengar) yang menentukan apakah akan memanggil pendengar sebelum server lain modifikasi.

Contoh: Melaksanakan EventListener

import org.spongepowered.api.event.EventListener;
import org.spongepowered.api.event.block.ChangeBlockEvent;

public class ExampleListener implements EventListener<ChangeBlockEvent.Break> {

    @Override
    public void handle(ChangeBlockEvent.Break event) throws Exception {
        ...
    }
}

Contoh: secara Dinamis Mendaftar Acara Pendengar

EventListener<ChangeBlockEvent.Break> listener = new ExampleListener();
Sponge.getEventManager().registerListener(this, ChangeBlockEvent.Break.class, listener);

Tip

Untuk acara pendengar yang dibuat dengan @Listener penjelasan, agar eksekusi dapat dikonfigurasi (lihat juga Tentang @Listener). Untuk dinamis terdaftar pendengar hal ini dimungkinkan dengan melewatkan Order untuk ketiga argumen EventManager#registerListener metode.

Tidak mendaftar Acara Pendengar

Untuk unregister sebuah peristiwa tunggal pendengar, anda dapat menggunakan EventManager#unregisterListeners(Obyek) metode, yang menerima sebuah instance dari kelas yang mengandung pendengar event.

EventListener listener = ...
Sponge.getEventManager().unregisterListeners(listener);

Atau, anda dapat menggunakan EventManager#unregisterPluginListeners(Obyek), lewat di sebuah referensi untuk plugin, untuk membatalkan semua acara pendengar yang terkait dengan plugin. Catatan bahwa ini akan menghapus semua plugin ini acara pendengar, termasuk orang-orang yang terdaftar dengan @Listener anotasi.

MyPlugin plugin = ...
Sponge.getEventManager().unregisterPluginListeners(plugin);

Tentang @Pendengar

Yang @Listener penjelasan memiliki beberapa bidang dikonfigurasi:

  • order adalah prioritas di mana pendengar acara ini akan dijalankan. Melihat Order enum di SpongeAPI untuk melihat pilihan yang tersedia.

  • beforeModifications menentukan jika acara pendengar harus dipanggil sebelum server lain mods, seperti Bengkel modifikasi. Secara default, ini diatur ke palsu.

Secara default, @Listener dikonfigurasi sehingga acara anda pendengar akan tidak bisa disebut jika acara tersebut dibatalkan dan telah dibatalkan (seperti dengan plugin lain).

GameReloadEvent

Untuk mencegah semua plugin yang menyediakan mereka sendiri reload perintah, Spons menyediakan bangunan di callback untuk plugin untuk mendengarkan, dan ketika dijalankan, melakukan ulang tindakan. Apa yang merupakan sebagai 'mengulang tindakan' ini murni hingga plugin untuk memutuskan. Yang GameReloadEvent akan api ketika seorang pemain menjalankan /sponge plugins reload perintah. Acara ini tidak terbatas untuk reload konfigurasi.

import org.spongepowered.api.event.game.GameReloadEvent;

@Listener
public void reload(GameReloadEvent event) {
    // Do reload stuff
}

Perhatikan bahwa ini berbeda untuk apa yang umumnya dianggap sebagai 'ulang', karena acara ini murni semua callback untuk plugin dan tidak melakukan reload sendiri.

Peristiwa Penembakan

Untuk mengirimkan sebuah acara, anda perlu sebuah objek yang mengimplementasikan :javadoc: Acara antarmuka.

Anda dapat peristiwa kebakaran menggunakan bus (EventManager):

boolean cancelled = Sponge.getEventManager().post(theEventObject);

Metode pengembalian benar jika acara dibatalkan, palsu jika tidak.

Penembakan Sponge Peristiwa

Hal ini dimungkinkan untuk menghasilkan contoh built-in peristiwa dengan statis SpongeEventFactory. Kelas ini secara otomatis dihasilkan sehingga tidak ada Javadocs. Menggunakan IDE pelengkapan otomatis untuk daftar metode yang ada. Peristiwa yang diciptakan oleh SpongeEventFactory yang kemudian diteruskan ke EventManager#post(Acara).

Contoh: Penembakan LightningEvent

import org.spongepowered.api.event.SpongeEventFactory;
import org.spongepowered.api.event.action.LightningEvent;
import org.spongepowered.api.event.cause.Cause;

LightningEvent lightningEvent = SpongeEventFactory.createLightningEvent(Cause.source(plugin).build());
Sponge.getEventManager().post(lightningEvent);

Peringatan

Sebuah :javadoc:`Penyebab` tidak akan pernah bisa kosong. Setidaknya harus mengandung plugin container.