Etkinlik Dinleyicileri
Bir olayın dinlenebilmesi için bir olayın dinlenmesi gerekir. Bu, herhangi bir adla bir yöntem yapıp, ilk parametrenin arzulanan olay türünü tanımlayarak ve sonra Listener açıklamalarının metoda eklenmesi ile yapılır.
import org.spongepowered.api.event.Listener;
@Listener
public void onSomeEvent(SomeEvent event) {
// Do something with the event
}
Buna ek olarak, bu yöntemleri içeren sınıf olay yöneticisine kaydedilmelidir:
Tüyo
Ana eklenti sınıfınızdaki olay dinleyicileri için (:javadoc:’Eklenti’ olarak ek açıklama), Sponge’nin otomatik olarak yapacağı gibi olayları nesneye kaydetmeniz gerekmez.
Not
The event bus supports supertypes. For example, ChangeBlockEvent.All extends
ChangeBlockEvent. Therefore, a plugin could listen to ChangeBlockEvent
and still receive
ChangeBlockEvent.All
s. However, a plugin listening to just ChangeBlockEvent.All
would not be notified
of other types of ChangeBlockEvent
.
Olay Dinleyicileri Kaydetme ve Kaydını İptal Etme
To register event listeners annotated by @Listener
that are not in the main plugin class, you can use
EventManager#registerListeners(PluginContainer, Object), which accepts a reference to the plugin and an instance of
the class containing the event listeners.
Örnek: Olay Dinleyicileri Diğer Sınıflara Kaydediliyor
import org.spongepowered.api.Sponge;
public class ExampleListener {
@Listener
public void onSomeEvent(SomeEvent event) {
// Do something with the event
}
}
Sponge.eventManager().registerListeners(this, new ExampleListener());
Dinleyiciye Olay Dinleyicileri Kaydediliyor
Bazı eklentiler (komut dosyası eklentileri gibi) dinamik olarak bir etkinlik dinleyicisi isteyebilir. Bu durumda olay dinleyicisi, @Listener
ile açıklanan bir yöntem değil, daha çok EventListener
arayüzünü uygulayan bir sınıfdır. Bu olay dinleyicisi daha sonra, ilk argüman olarak eklentiye bir başvuruyu kabul eden EventManager#registerListener
‘i çağırarak kaydedilebilir, ikinci argüman olarak ele alınan olayların Class
ve final olarak dinleyicidir argüman. İsteğe bağlı olarak, olay dinleyicisini üçüncü argüman olarak çalıştırmak için bir Order veya bir dinleyici değeri (dinleyicinin örneğinden önce) dördüncü bağımsız değişkeni olarak belirtebilirsiniz; bu, dinleyiciyi diğer sunucu değişiklikleri öncesinde çağırıp aramayacağınıza karar verebilir.
Örnek: EventListener uygulamak
import org.spongepowered.api.event.EventListener;
import org.spongepowered.api.event.block.ChangeBlockEvent;
public class ExampleListener implements EventListener<ChangeBlockEvent.All> {
@Override
public void handle(ChangeBlockEvent.Break event) throws Exception {
[...]
}
}
Örnek:Dinamik olarak Etkinlik Dinleyicisini Kaydetmek
EventListener<ChangeBlockEvent.All> listener = new ExampleListener();
EventListenerRegistration registeration = EventListenerRegistration
.builder(ChangeBlockEvent.All.class)
.listener(listener)
.plugin(pluginContainer)
.build();
Sponge.eventManager().registerListener(registeration);
Tüyo
@Listener
açıklamasıyla yaratılan olay dinleyicileri için yürütme sırası yapılandırılabilir (bkz. Hakkında @Listener). Dinamik olarak kayıtlı dinleyiciler için bu, üçüncü argümana``EventManager#registerListener`` yöntemine bir Order
vererek mümkündür.
Etkinlik Dinleyicilerinin Kaydının Kaydedilmesi
Tek bir olay dinleyicisini silmek için, olay dinleyicilerini içeren sınıfın bir örneğini kabul eden EventManager#unregisterListeners(Object) yöntemi kullanabilirsiniz.
EventListener listener = ...;
Sponge.getEventManager().unregisterListeners(listener);
Alternatif olarak, şunları kullanabilirsiniz EventManager#unregisterPluginListeners(Object), bu eklentiyle ilişkili tüm olay dinleyicilerinin kaydını silmek için eklentiye bir referans gönderir. Bunun, eklentinin olayın dinleyicilerinin * hepsini* kaldırdığı unutmayın; bunlara @Listener
ek açıklamalarıyla kayıtlı olanlar da dahil.
PluginContainer plugin = ...;
Sponge.eventManager().unregisterListeners(plugin);
@Listener hakkında
@Listener
ek açıklaması ayarlanabilir bir kaç alana sahiptir:
order
is the priority in which the event listener is to be run. See the Order enum in SpongeAPI to see the available options.Eğer etkinlik dinleyicisi Forge modları gibi diğer sunucu modlarından önce çağırılmalı ise ``beforeModifications``bunu belirtir.Varsayılan olarak bu yanlış şeklinde ayarlanır.
Varsayılan olarak,``@Listener`` ayarlanır ve böylece eğer iptal edilebilir ise veya iptal edildiyse (mesela başka eklenti tarafından) olay dinleyiciniz çağırılmaz.
RefreshGameEvent
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 refresh actions. What constitutes as a ‘refresh action’ is purely up to the
plugin to decide. The RefreshGameEvent will fire when a player executes the
/sponge plugins refresh
command. The event is not necessarily limited to reloading configuration.
import org.spongepowered.api.event.lifecycle.RefreshGameEvent;
@Listener
public void refresh(GameRefreshEvent event) {
// Do refresh stuff
}
Bunun, yalnızca ‘eklentiler için geri arama’ olduğu ve kendi başına herhangi bir yeniden yükleme yapmadığı için, genel olarak bir ‘yeniden yükle’ olarak kabul edilenler için farklı olduğunu unutmayın.
Ateşleme Olayları
Bir olayı göndermek için, Event ara birimini uygulayan bir nesneye ihtiyacınız var.
Etkinlik otobüsü kullanarak etkinlikleri ateşleyebilirsin (EventManager):
boolean cancelled = Sponge.eventManager().post(theEventObject);
Yöntem olay iptal edildiğinde true
, değilse false
döndürür.