Les Access Transformers
Puisque certaines parties du code de Minecraft n’ont pas été créées dans le but d’être utilisées depuis l’extérieur, vous pouvez vous retrouver dans une situation où vous avez besoin d’accéder une variable ou une méthode qui n’est pas publique. Alors que vous voudriez normalement utiliser la Reflection pour accéder à la variable ou la méthode, MCP rendra cela plus difficile puisque vous avez deux noms différents - les noms MCP dans l’environnement de développement et les noms de Searge en production.
Par exemple pour accéder à la méthode tick()
en utilisant la Reflection, vous auriez besoin d’utiliser tick
dans l’environnement de développement, mais func_71217_p
en production. L’étape de ré-obfuscation gère uniquement les références directes aux méthodes et aux variables, pas les paramètres String passés à l’appel de Reflection.
Comme solution, ForgeGradle supporte l’utilisation des Access Transformers (ou AT) qui rendent automatiquement la méthode/variable spécifiée publique pour que vous puissiez les référencer directement (sans Reflection). Alors qu’ils sont principalement destinés pour une utilisation avec le code de base de Minecraft, ils peuvent également être appliqués aux classes d’autres projets. Si configuré dans le manifeste du JAR du plugin, SpongeVanilla et Forge les appliqueront également en production.
Réglages
ForgeGradle va automatiquement chercher pour des fichiers d’Access Transformers avec le suffixe de nom de fichier _at.cfg
dans vos dossiers de ressources. Pour être en mesure d’utiliser l’Access Transformer au runtime, vous devrez les ajouter dans un dossier META-INF
dans votre dossier de ressources, par exemple META-INF/myplugin_at.cfg
.
Il y a 3 différents types d’Access Transformers : Vous pouvez changer les modifiers de classes, de variables et de méthodes. Une ligne d’Access Transformer est définie en 2 parties (pour les classes) ou 3 parties (pour les variables et les méthodes), chacune séparée par un espace.
Le type d’accès avec lequel vous voulez changer la méthode/variable, par exemple
public
ouprotected
. Pour supprimerfinal
d’une variable, ajoutez -f` après le type d’accès, par exemplepublic-f
.Nom complet de la classe, exemple
net.minecraft.server.MinecraftServer
Pour les variables et les méthodes : Nom de variable Searge ou nom de méthode Searge et signature de méthode, exemple
field_54654_a
oufunc_4444_a()V
Astuce
Vous pouvez ajouter des commentaires en les préfixant par #
. Une bonne convention consiste à ajouter le nom MCP après chaque ligne d’Access Transformer afin que vous sachiez à quelle méthode/variable la ligne fait référence.
Voici deux exemple de lignes d’Access Transformers :
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
Pour appliquer les Access Transformers à votre environnement de développement, exécutez la tâche Gradle setupDecompWorkspace
de nouveau et actualisez votre projet Gradle :
gradle setupDecompWorkspace
Astuce
Vous pouvez utiliser le MCP bot qui est présent dans les salons IRC MCP et Sponge pour obtenir rapidement la ligne d’Access Transformer pour une variable ou une méthode. Après avoir regardé une méthode à l’aide de !gm <mcp method name>
ou une variable en utilisant !gf <mcp field name>
, il suffit de copier la ligne listée AT
à votre fichier d’Access Transformer.
Note
Rendre une variable/méthode moins accessible (exemple public
-> private
) n’est pas supporté.
Production
Pour appliquer les Access Transformers en production, vous devez ajouter une entrée manifest FMLAT
à votre plugin avec le nom du fichier de votre Access Transformer dans le dossier `` META-INF``.
jar {
manifest.attributes('FMLAT': 'myplugin_at.cfg')
}