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és 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 ou protected. Pour supprimer final d’une variable, ajoutez -f` après le type d’accès, par exemple public-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 ou func_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, ou le salon #bot-spam sur Discord 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 dans 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')
}