Access Transformers

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.

Sebagai sebuah solusi, ForgeGradlemndukung penggunaan access transformers (atau AT) yang secara otomatis membuat methods/fields umum yang ditentukan sehingga anda dapat mengacu pada mereka secara langsung (tanpa gambaran). Sementara mereka secara khusus diperuntukan sebagai pemakaian dengan dasar kode Minecraft. mereka juga bisa diterapkan untuk golongan dari project yang lain. Jika diatur kedalam plugin JAR yang jelas, SpongeVanilla dan Forge juga akan menerapkannya kedalam produksi.

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

Anda dapat menggunakan MCP bot yang dihadirkan dalam saluran IRC MCP dan Sponge agar secara cepat memperoleh access transformer line untuk sebuah field atau method. Setelah menemukan sebuah method menggunakan !gm <mcp method name> atau sebuah field menggunakan !gf <mcp field name>, langsung salin AT line yang tertera ke dalam arsip access transformer anda.

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')
}