Transformadores de Acceso

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.

Como una solución, ForgeGradle soporta el uso de transformadores de acceso (o AT) que automáticamente hacen a los métodos/campos especificados públicos de modo que puedas hacerles referencia directamente (sin reflexión). Aunque que principalmente son destinados para el uso con la base de código de Minecraft, también se pueden aplicar a las clases de otros proyectos. Si es configurado en el manifiesto JAR de la extensión, SpongeVanilla y Forge también los aplicaran en la producción.

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

Puedes utilizar el MCP bot que esta presente en el MCP y los canales Sponge IRC para obtener rápidamente la linea transformadora de acceso para un campo o método. Después de buscar un método usando !gm <mcp method name> o un campo usando !gf <mcp field name>, simplemente copia la linea AT listada en tu archivo del transformador de acceso.

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