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.
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
atauprotected
. Untuk menghilangkanfinal
dari sebuah field, tambahkan-f
setelah tipe akses, contohnyapublic-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
orfunc_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')
}