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 o protected. Para eliminar final de un campo, agregar -f después del tipo de acceso, por ejemplo public-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 o func_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')
}