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