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.
PluginContainer plugin = ...;
Sponge.getEventManager().unregisterPluginListeners(plugin);
Tentang @Pendengar
Yang @Listener
penjelasan memiliki beberapa bidang dikonfigurasi:
order
is the priority in which the event listener is to be run. See the Order enum in SpongeAPI to see the available options.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
To prevent all plugins providing their own reload commands, Sponge provides a built-in callback for plugins to listen
to, and when executed, perform any reloading actions. What constitutes as a 'reloading action' is purely up to the
plugin to decide. The GameReloadEvent will fire when a player executes the
/sponge plugins reload
command. The event is not necessarily limited to reloading configuration.
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.action.LightningEvent;
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.event.SpongeEventFactory;
PluginContainer plugin = ...;
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();
LightningEvent lightningEvent = SpongeEventFactory.createLightningEventPre(Cause.of(eventContext, plugin));
Sponge.getEventManager().post(lightningEvent);
Peringatan
Sebuah :javadoc:`Penyebab` tidak akan pernah bisa kosong. Setidaknya harus mengandung plugin container.