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.

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

@Listener hakkında

@Listener ek açıklaması ayarlanabilir bir kaç alana sahiptir:

  • order etkinlik dinleyicisinin çalıştırılacağı yerde önceliklidir. Mevcut seçenekleri görmek içib SpongeAPI’deki :javadoc:`Order`enumuna bakın.

  • 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

Tüm eklentilerin kendi yeniden yükleme komutlarını sağlayan önlemek için, Sünger dinlemek için eklentiler için dahili bir geri arama sağlar ve yürütülürken herhangi bir yeniden yükleme eylemi gerçekleştirir. ‘Yeniden yükleme eylemi’ olarak neyin oluşturduğu tamamen karar vermek için eklentiye kalmıştır. GameReloadEvent, bir oyuncu /sponge plugins reload komutunu çalıştırdığında tetiklenir. Olay, mutlaka yeniden yapılandırma ile sınırlı değildir.

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

Sabit SpongeEventFactory ile yerli olayların örneklerini oluşturmak mümkündür. SpongeEventFactory tarafından oluşturulan olaylar, ardından EventManager#post(Event)’e geçirilir.

Örnek: LightningEvent ateşleme

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

Uyarı

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