Acara Filter

Sekarang setelah Anda menghabiskan sedikit waktu untuk bekerja dengan acara, Anda mungkin telah memperhatikan bahwa ada beberapa prasyarat yang biasanya Anda periksa saat menulis pendengar acara. Filter acara adalah sekelompok anotasi yang membantu Anda dengan mengizinkan Anda untuk secara otomatis memvalidasi aspek acara, dan jika validasi gagal, pendengar Anda tidak akan dipanggil. Hal ini memungkinkan pendengar Anda didedikasikan untuk logika pawang Anda, bukan prasyarat, sehingga menghasilkan kode yang lebih bersih.

Acara filter datang dalam dua acara varietas, jenis filter dan parameter filter.

Filter jenis acara adalah anotasi metode yang diterapkan pada metode pendengar Anda beserta anotasi Listener dan berikan beberapa filter berdasarkan jenis atau keadaan acara.

Parameter filter memvalidasi objek yang terkandung dalam acara seperti penyebabnya. Mereka datang di sebuah lanjut dua varietas parameter sumber dan parameter filter. Setiap tambahan parameter harus memiliki salah satu sumber annotation, dan optionally mungkin termasuk sejumlah menyaring annotations.

Acara Tipe Filters

@Memasukan/@Meniadakan Dua Parameter ini digunakan dalam hubungannya untuk mendengarkan acara supertype :javadoc: 'MempengaruhiEntitasAcara' sementara penyempitan acara yang anda terima hanya diperluas dari acara yang anda dengarkan.

Sabagai contoh:

@Listener
@Exclude(InteractBlockEvent.Primary.class)
public void onInteract(InteractBlockEvent event) {
    // do something
}

Pendengar ini biasanya akan disebut memperluas semua acara untuk InteraksiBidangAcara. Namun, :javadoc: 'Meniadakan' penjelasanya akan mencegah pendengaran anda dapat disebut :javadoc: 'InteraksiBidangAcara.Primary' acara (hanya meninggalkan :javadoc: 'InteraksiBidangAcara.Secondary' acara).

Contoh :javadoc:`Mencakup` seperti:

@Listener
@Include({DamageEntityEvent.class, DestructEntityEvent.class})
public void onEvent(EntityEvent event) {
    // do something
}

Pendengar ini biasanya akan disebut untuk semua EntityEvents, namun Seperti penjelasan menyempit itu untuk hanya menerima :javadoc: 'DamageEntityEvent' dan :javadoc: 'DamageEntityEvent',s.

@Dibatalkan Penjelasan ini memungkinkan penyaringan acara mereka oleh negara dibatalkan pada saat itu bahwa pendengar acara anda akan disebut biasanya. Oleh ketidakhadiran pendengar anda acara tidak akan disebut jika acara ini telah dibatalkan oleh pendengar acara sebelumnya. Namun anda dapat mengubah prilaku ini untuk salah satu dari tiga negara tergantung pada :javadoc: 'Tristate' nilai di :javadoc: 'Dibatalkan' penjelasan.

  • ` Tristate.False ` adalah perilaku default jika IsCancelled penjelasan tidak hadir, dan tidak akan menelepon pendengarmu jika acara ini telah dibatalkan.

  • Tristate.UNDEFINED akan menyebabkan pendengar anda tersebut untuk terlepas dari pembatalan negara dari acara tersebut.

  • ` Tristate.Betul ` akan menyebabkan pendengar anda untuk disebut hanya jika acara ini telah dibatalkan oleh acara sebelumnya pendengar.

Penyaringan Parameter

Penyaringan parameter memungkinkan anda untuk menyaring berdasarkan benda-benda dalam acara tersebut. Anotasi ini datang dalam dua jenis, sumber dan filter. Masing-masing parameter tambahan untuk metode pendengarmu, di luar normal acara parameter, membutuhkan persis satu sumber penjelasan dan opsional dapat memiliki sejumlah filter penjelasan.

Parameter Sumber Anotasi

Parameter sumber penjelasan menceritakan peristiwa sistem di mana ia harus mencari parameter nilai.

@Pertama Parameter sumber penjelasan ini menceritakan peristiwa sistem untuk menemukan objek pertama dalam acara ini penyebab yang sesuai dengan jenis parameter anda (Ini adalah setara dengan :javadoc:`Penyebab#pertama(kelas)`). Jika tidak ada objek yang setara dengan parameter ini maka pendengarmu tidak akan disebut.

Dalam contoh ini pendengar anda hanya dapat disebut jika ada pemain dalam acara adalah penyebabnya, dan yang "pemain" parameter akan ditetapkan untuk penyebab pemain pertama yang hadir.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @First Player player) {
    // do something
}

@Lalu Hal ini mirip dengan "@Pertama" namun hal itu bukan untuk membuat dapat disebut untuk :javadoc: 'Penyebab#lalu(Kelas)'.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @Last Player player) {
    // do something
}

@Sebelum Parameter dari sumber penjelasan ini menyampaikan mekanisme acara untuk menemukan yang sebelum diantara jenis yang ditentukan oleh penjelasan parameter ( Ini adalah setera dengan :javadoc: 'Penyebab#sebelum(Kelas)' ). Selain itu, objek yang ditemukan harus sesuai dengan jenis parameter. Jika tidak ada objek yang ditemukan memenuhi kriteria ini, maka pendengar anda tidak disebut.

Dalam contoh ini pendengar anda hanya bisa disebut jika ada pemain terletak dalam wadah plugin acara ini adalah penyebabnya, yang "pemain" parameter yang akan ditetapkan untuk pemain.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @Before(PluginContainer.class) Player player) {
    // do something
}

@Sesudah Hal ini mirip dengan "@Sebelum", tapi itu bukan menggunakan :javadoc: 'Penyebab#sesudah(Kelas)'.

@Semua Penjelasannya dari sumber parameter ini mengharuskan dijelaskan parameter berupa jenis array. Array kembali akan setara dengan isi dari panggilan :javadoc: 'Penyebab#Semua(Kelas)'. Oleh ketidakhadiran jika kembali array akan kosong maka validasi gagal namun hal ini dapat dinonaktifkan melalui pengaturan "ignoreEmpty=false".

Dalam contoh ini pendengar anda akan selalu dapat disebut, meskipun para pemain mungkin akan kosong jika hal ini menyebabkan tidak ada pemain yang terisi.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @All(ignoreEmpty=false) Player[] players) {
    // do something
}

@Akar Penjelasan dari sumber parameter ini akan mengambil objek akar penyebab, setara dengan :javadoc:'Penyebab#akar()'. hal ini juga melakukan pemeriksaan tambahan yang jenis akar objek sesuai dengan jenis parameter anda.

@Bernama Parameter ini sumber penjelasan menjelaskan peristiwa sistem untuk menemukan objek dengan nama yang ditentukan oleh penjelasan parameter ( Ini adalah setara dengan :javadoc: 'Penyebab#dapatkan(String, Kelas)' ). Selain itu, objek yang ditemukan harus sesuai dengan jenis parameter. Jika tidak ada objek yang ditemukan memenuhi kriteria ini, maka pendengar anda tidak disebut.

Dalam contoh ini pendengar anda hanya akan dipanggil jika ada pemain yang terkait dengan nama "BernamaPenyebab.PEMILIK" . Yang "Pemain" parameter yang akan diatur untuk pemain itu.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @Named(NamedCause.OWNER) Player player) {
    // do something
}

@Penyerap Parameter Ini sumber penjelasan akan mengambil penyerap di acara dengan nama tertentu. Jika ditentukan pengambil kembali "Opsional"," @Penyerap" akan secara otomatis membuka "Opsional".

Dalam contoh ini, kita mencoba untuk mengambil nilai dari "dapatMengunakanHasilBarang" menggunakan "Penyerap" penjelasan.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @Getter("getUseItemResult") Tristate result) {
    // do something
}

Parameter Filter Anotasi

Parameter penyaring penjelasan menambahkan validasi tambahan untuk benda-benda yang kembali dari parameter sumber penjelasan. Seperti dengan semua acara penyaringan jika ada validasi ini gagal maka pendengar anda tidak akan dipanggil.

** @ Mendukung ** Filter parameter ini dapat diterapkan ke tipe parameter manapun yang adalah : javadoc: DataHolder. Dibutuhkan perpanjangan kelas : javadoc: DataManipulator sebagai parameternya dan memvalidasi bahwa DataHolder` yang diberi anotasi mendukung 'DataManipulator` yang diberikan. Validasi ini setara dengan : javadoc: CompositeValueStore # support (Class <? Extends H>).

Dalam contoh ini pendengar akan disebut hanya jika ada entitas yang dalam hal ini menyebabkan, dan jika entitas yang mendukung data manipulator :javadoc:`Dataterbang`.

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @First @Supports(FlyingData.class) Entity entity) {
    // do something
}

** @ Has ** Filter parameter ini mirip dengan filter parameter `` @ Supports``, kecuali bahwa itu juga memvalidasi bahwa `` DataHolder` berisi sebuah instance dari DataManipulator` yang diberikan.

Dalam contoh ini pendengar akan disebut hanya jika ada entitas yang dalam hal ini menyebabkan, dan jika entitas yang memiliki sebuah contoh `Dataterbang`**.**

@Listener
public void onInteract(InteractBlockEvent.Secondary event, @First @Has(FlyingData.class) Entity entity) {
    // do something
}

Catatan

Kedua @ dan @Mendukung memiliki sebuah parameter opsional terbalik yang dapat diatur untuk menyebabkan validasi gagal jika tidak memiliki, atau tidak mendukung, target DataManipulasi.