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.Alls. 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.