Etkinlik Nedenleri
Etkinlikler, oyun eylemlerine ek mantık eklemek için harikadır. Ama yanında etkinliğin meydana gelmesine cause olmuş (neden olmuş) olmayan bağlamların sağlanmasının dezavantajları vardır. Cause nesnesi geliştirmeye ve etkinlik hakkında ek bağlamsal bilgi almaya olanak verir. Bu bağlamsal bilgi etkinlik dinleyicisinin davranışına göre şekillenmek için kullanılabilir.
Örneğin, bir dünya koruma eklentisi, hangi oyuncunun, oyuncuların etkinliğin iptal olup olmaması gerektiğine karar verebilmelerinden önce ChangeBlockEvent meydana gelmesine neden olduğu bilgisine ihtiyaç duyar. Farklı kaynak koşulları için alt olayların kalabalık yaratmasının geleneksel rotasını takip etmektense bu bilgi etkinliğin Cause
’unda sağlanmıştır.
Her etkinlik, etkinliğin niçin bitirildiğine dair bilgi için sorgulanabilen ``Cause``nesnesi sağlar. Couse nesnesi bir etkinlikten sadece Event#getCause() çağrılarak kurtarılmış olabilir.
Cause’dan telafi edilen nesneler
Yapısal olarak, bir Cause
nesnesi, nesnelerin sonraki listesini içerebilir. Burda tartıştığımız bir Neden nesnesinden bilgi telafi etmenin bir çok metodu vardır, lütfen tam listeleme için Javadocs. bakınız.
Not
Bir neden içindeki bu nesneler, ilk nesnenin etkinliğin en doğrudan nedeni olması gibi düzenlenmiştir, ve sonraki nesnelerin önemi gittikçe azalıyor ve/veya sonraki nesneler sadece içerik bilgisi sağlıyor olabilir.
Cause#root()’un boş olmama ihtimalinden itibaren, root
yapmak garantidir.
Cause#first(Class) ya aynısı ya da verilmiş sınıfın alt türü olan tür, neden zinciri içindeki ilk nesneyi döndürür. Örneğin bir varlık tarafından takip edilen oyuncu içeren verilmiş bir neden [Player, Entity, ...]
@Listener
public void onEvent(ExampleCauseEvent event) {
Cause cause = event.getCause(); // [Player, Entity]
Optional<Player> firstPlayer = cause.first(Player.class); // 1
Optional<Entity> firstEntity = cause.first(Entity.class); // 2
}
Bir Entity (varlık) alt türü Player (oyuncu) olarak Entity türü için istekle eşleşen ve bir Player türü için istekle doğrudan eşleşen her iki seçenek de oyuncu nesnesi içerebilirdi.
Cause#last(Class) neden zinciri tür eşleşmesinde son değeri döndürmesi dışında Cause#first(Class)
ile benzeşir.
Yukarıdaki örnekten devam ederek, eğer Cause#last(Class)
çağırmayı değiştirmek yerine ilk seçenek hala oyuncu nesnesini içerebilirdi ama ikinci seçenek şimdi nedenin ikinci pozisyonunda bizim geçmiş olduğumuz varlık içerebilirdi.
Cause#containsType(Class) boolean değeri döndür ve neden zincirinin geliştirilen türde nesne eşleşmesi içerip içermediğini kontrol etmek için kullanılabilir.
Cause#all() sadece daha avantajlı kullanıma izin veren neden içindeki bütün projeleri döndürür.
İsimlendirilmiş Nedenler
Bazen neden içindeki nesnelerin düzenlenmesi, nasıl bir nesnenin etkinlikle ilişkili olarak temsil edeceği konusunda uygun fikir almak için yeterli değildir. NamedCause kullanılacak yer burasıdır. İsimlendirilmiş nedenler neden içindeki nesneleri kolayca tanımlanmasını ve istenmesini sağlayan bir özel isimle etiketleme için bir metot sağlar. İsimlendirilmiş nedenler için kılıf kullanmanın bazı örnekleri bir ChangeBlockEvent.Grow Notifier’ıdır ya da bir DamageEntityEvent Source’udur.
Retrieving a named entry from a cause
@Listener
public void onGrow(ChangeBlockEvent.Grow event) {
Optional<Player> notifier = event.getCause().get(NamedCause.NOTIFIER, Player.class);
}
Bu örnek zincirde bulunuyorsa, bir adla ilişkilendirilerek beklenen nesneyi almak için :javadoc:’Cause#get(String, Class<T>)’ işlevini kullanır. Buna ek olarak :javadoc:’Cause#getNamedCauses()’ mevcut tüm isimleri ve bunlarla ilişkili nesneleri bulmak için kullanılabilir bir “Map<String, Object>” sağlar.
Not
‘’NamedCause’’s için bilinen bazı tanımlayıcı isimler, ‘’NamedCause’’ sınıfında statik alanlar olarak mevcuttur. Belirli olaylara özgü tanımlayıcılar, genellikle olay sınıfında statik alanlar olarak bulunabilir, örneğin :javadoc:’DamageEntityEvent#SOURCE’.
Özel nedenler oluşturma
Bir etkinliği kovmak için bir sebep oluşturmak son derece kolaydır. En zoru, hangi bilgiye neden dahil edileceğine karar verebilmektir. Plugin genellikle başka yollarla tetiklenen bir etkinliği siz de tetikleyebiliyorsanız, eklenti içeriği eklemek istediğiniz diğer plugin, etkinliğin plugin geldiğini biliyorsunuzdur. Veya bir etkinlik nedeniyle bir oyuncu adına etkinliği kovuyor iseniz o oyuncuya genellikle neden dahil edildiğini anlatmak iyi bir fikirdir.
Not
Nesneler değişmez olduğundan, bir kez oluşturulduğunda değiştirilemezler.
Kullanarak :javadoc:’Cause#of(NamedCause)’ bir nesne dizisinden bir sebep oluşturabilirsiniz. Nesneler neden zincirine, metne aktarılacağı sırayla eklenecek, bu nedenle ilk nesne parametresi temel neden haline gelecektir. Unutmayın, bir ‘Cause’ boş olmayabilir, bu nedenle en az bir boş olmayan parametre her zaman gereklidir.
Zaten bir sebep nesneniz varsa ve zincire daha fazla nesne eklemek istiyorsanız :javadoc:’Cause#with(NamedCause, NamedCause …)’. Bu yeni bir orijinal neden, zaten var olan nesneleri daha sonra sağladığınız ek nesneleri içerir.
Sonunda, tanımlanmış adlandırılmış bir ilk çağrı ile bir nedene bir nesne eklemek isterseniz :javadoc:’NamedCause#of(String, Object)’ ve sonra döndürülen ‘’NamedCause’’ örneğini bir normal neden zincirine nesne olarak iletin .