Transformadores de Acceso
Advertencia
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!
Ya que algunas partes del código Minecraft no fueron diseñadas para ser usadas desde el exterior, puedes encontrarte en una situación en la que necesites acceder a un campo o método que no es público. Aunque normalmente utilizarías reflexión para obtener acceso al campo o método, MCP hará esto más difícil ya que tienes dos nombres diferentes - los nombres de la MCP en el entorno de desarrollo y los nombres del Buscador en producción.
Por ejemplo para acceder al método tick()
usando reflexión necesitarías usar tick
en el entorno de desarrollo, pero func_71217_p
en producción. El paso de re-ofuscación solo maneja referencias directas a métodos y campos, no el parámetro de cadena pasado a la llamada de reflexión.
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.
Configuración
ForgeGradle buscara automaticamente archivos de transformacion de acceso con el sufijo del nombre del archivo _at.cfg
en tus carpetas de recursos. Para poder utilizar los transformadores de acceso en tiempo de ejecución, debes agregarlos a una carpeta META-INF
en tu directorio de recursos, por ejemplo META-INF/myplugin_at.cfg
.
Existen 3 tipos de transformadores de acceso: puedes cambiar los modificadores de clases, campos y métodos. Una línea de transformador de acceso se define por 2 piezas (de clases) o 3 (para campos y métodos), cada uno separado por un espacio.
El tipo de acceso que desees para cambiar el campo de método, por ejemplo
public
oprotected
. Para eliminarfinal
de un campo, agregar-f
después del tipo de acceso, por ejemplopublic-f
.Nombre de clase completo, por ejemplo
net.minecraft.server.MinecraftServer
Para campos y métodos: El nombre del campo de búsqueda o el nombre de la firma del método, por ejemplo
field_54654_a
ofunc_4444_a()V
Truco
Puedes agregar comentarios anteponiendo #
. Una buena convención es agregar el nombre de MCP después de cada línea de transformador de acceso para saber a qué campo/método de la línea se esta refiriendo.
Aquí hay dos ejemplos de lineas de transformadores de acceso:
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
Para aplicar los transformadores de acceso al entorno de desarrollo, vuelve a ejecutar la tarea de ``setupDecompWorkspace`de Gradle y actualiza tu proyecto de Gradle:
gradle setupDecompWorkspace
Truco
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.
Nota
Hacer un método/campo menos accesible (por ejemplo, public
-> private
) no es compatible.
Producción
Para aplicar los transformadores de acceso en la producción, es necesario añadir un manifiesto FMLAT
de entrada a tu extensión con el nombre de tu transformador de acceso en el directorio META-INF
.
jar {
manifest.attributes('FMLAT': 'myplugin_at.cfg')
}