Access Transformers

Peringatan

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

Sejak Beberapa bagian kode Minecraft tidak dirancang untuk digunakan dari luar, mungkin anda bisa menemukan diri anda didalam situasi di mana Anda perlu mengakses sebuah field atau method yang tidak umum. Sementara Anda biasanya akan menggunakan reflection untuk mengakses field atau method, MCP akan membuatnya lebih sulit sejak Anda memiliki dua nama yang berbeda - Nama dari MCP di lingkungan pengembangan dan nama dari Searge didalam produksi.

Sebagai contoh untuk mengakses method tick() menggunakan reflection kamu harus menggunakan tick di lingkungan pengembangan, tetapi func_71217_p didalam produksi. Langkah yang membingungkan hanya memegang acuan langsung untuk methods dan fields, bukanlah string parameter yang dilewatkan ke reflection call.

As a solution, ForgeGradle supports using access transformers (or AT) that automatically make the specified methods/fields public so you can reference them directly (without reflection). While they are primarily intended for usage with the Minecraft code base, they can be also applied to classes from other projects. If configured in the JAR manifest of the plugin, SpongeVanilla and Forge will also apply them in production.

Pengaturan

ForgeGradle akan secara otomatis memindai arsip-arsip access transformer dengan nama arsip suffix _at.cfg didalam resource folder anda. Untuk dapat menggunakan access transformer di runtime, anda harus menambahkan mereka ke sebuah berkas META-INF didalam resource directory anda, sebagai contoh META-INF/myplugin_at.cfg.

Ada 3 jenis perbedaan dari access transformers: anda dapat mengatur perubahan dari classes, fields dan methods. Sebuah access transformer line didefinisikan oleh 2 bagian (untuk classes) atau 3 bagian (untuk fields dan methods, masing-masing dipisahkan oleh sebuah spasi.

  • Jenis akses dari m,ethod/field yang ingin anda ubah ke, contohnya public atau protected. Untuk menghilangkan final dari sebuah field, tambahkan -f setelah tipe akses, contohnya public-f.

  • Nama golongan yang terkualifikasi penuh, contohnya net.minecraft.server.MinecraftServer

  • Untuk fields dan methods: nama Searge field atau nama method dan method signature sebagai contoh field_54654_a or func_4444_a()V

Tip

Anda dapat menambahkan komentar dengan mengawali mereka dengan #`. Sebuah metode yang baik adalah dengan menambahkan nama MCP pada setiap access transformer line jadi anda mengetahui field/method mana yang mengacu pada line tersebut.

Inilah dua contoh untuk mengakses transformer lines:

public-f net.minecraft.server.MinecraftServer field_71308_o # anvilFile
public net.minecraft.server.MinecraftServer func_71260_j()V # stopServer
public-f net.minecraft.item.ItemStack

Untuk menerapkan access transformer ke dalam ruang lingkup pengembangan anda, jalankan Gradle setupDecompWorkspace task lagi dan refresh proyek Gradle anda:

gradle setupDecompWorkspace

Tip

You can use the MCP bot which is present in the MCP and Sponge IRC channels, or in the #bot-spam channel on Discord, to quickly get the access transformer line for a field or method. After looking up a method using !gm <mcp method name> or a field using !gf <mcp field name>, simply copy the listed AT line to your access transformer file.

Catatan

Membuat sebuah field/method lebih sedikit diakses (contohnya public -> private) tidak didukung.

Produksi

Untuk menerapkan access transformers didalam produksi, anda harus menambahkan sebuah masukan``FMLAT`` yang jelas ke plugin anda dengan nama arsip dari access transformer anda di bagian META-INF.

jar {
    manifest.attributes('FMLAT': 'myplugin_at.cfg')
}