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

Etkinlik otobüsü supertypes destekler. Örmeğin,:javadoc:ChangeBlockEvent.Break :javadoc:`ChangeBlockEvent`i genişletir. Bu sebeple bir eklenti ``ChangeBlockEvent``i dinleyebilir ve hala ``ChangeBlockEvent.Break``ler alabilir. Ancak sadece ChangeBlockEvent.Break dinleyen eklenti diğer ``ChangeBlockEvent``çeşitlerinden haberdar olamaz.

Olay Dinleyicileri Kaydetme ve Kaydını İptal Etme

Ana eklenti sınıfında olmayan``@Listener``tarafından not alınmış etkinlik dinleyicilerini kaydetmek için eklentiye bir başvuruyu ve etkinlik dinleyicilerini içeren sınıfın bir örneğini kabul eden EventManager#registerListeners(Object, Object) kodunu kullabilirsiniz.

Ö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.getEventManager().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.Break> {

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

Örnek:Dinamik olarak Etkinlik Dinleyicisini Kaydetmek

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

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.getEventManager().unregisterPluginListeners(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.

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
}

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.getEventManager().post(theEventObject);

Yöntem olay iptal edildiğinde true, değilse false döndürür.

Sponge Olaylarını Çalıştırmak

Statik SpongeEventFactory``ile yerleşik olayların örneklerini oluşturmak mümkündür. Bu sınıf otomatik olarak oluşturulur, böylece Javadocs yoktur. Mevcut yöntemleri listelemek için IDE'nizin otomatik tamamlamasını kullanın. ``SpongeEventFactory tarafından oluşturulan olaylar daha sonra EventManager#post(Event) iletilir.

Örnek: LightningEvent ateşleme

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);

Uyarı

A :javadoc:`Neden` asla boş olamaz. En azından eklenti kabını içermelidir.