Utiliser les Access Transformer



  • Sommaire

    Introduction

    Il vous est déjà arrivé de ne pas avoir accès à une méthode ou une variable ? C'est énervant n'est-ce pas ? Et bien voici comment modifier son accès.

    ATTENTION ! Lisez d'abord cette partie avant d'attaquer le tutoriel

    Il existe 2 méthodes pour accéder aux variables non-accessibles, la 1ere consiste à utiliser la classe ObfuscationReflectionHelper, la 2eme méthode est celle présentée ici. Cette méthode ne doit être appliquée seulement si vous accédez souvent à la variable en question, si vous y accédez une fois au démarrage (par exemple) il est inutile d'utiliser cette méthode.

    Pré-requis

    Code

    build.gradle :

    La première chose que nous allons faire c'est spécifié à forge que l'on utilise l'access transformer, pour cela copiez ce code dans votre build.gradle en remplaceant le nom du fichier par ce que vous voulez (ce doit être le même après et il doit finir en _at.cfg) :

        jar {
            manifest {
                attributes 'FMLAT': '<modid>_at.cfg'
            }
        }
    

    Maintenant allez dans votre dossier de resources (par défaut src/main/resources), créez un dossiez "META-INF" et dedans créez un fichier texte du même nom que specifié avant.

    Voici comment nous allons structurer le fichier :

    # Je suis un commentaire
    <visibilité><chemin vers la classe> <nom obfusqué de la variable> # pattern pour une variable (par convention, on met le nom non-obfusqué après le "#")
    <visibilité><chemin vers la classe> <nom obfusqué de la méthode>(<paramètres>) <type retourné># pattern pour une fonction (par convention, on met le nom non-obfusqué après le "#")
    

    La visibilité correspond à la visibilité que vous voulez (généralement public).
    Le chemin vers la classe est tout simplement <package>.<classe>, par exemple pour la classe EntityRenderer ce serait net.minecraft.client.renderer.EntityRenderer
    Le nom obfusqué correspond au nom de la variable ou de la méthode mais obfusquée, pour accéder au nom je vous conseille mon logiciel ObfuscatedNameFinder
    Pour ce qui est des paramètres et du type retourné, c'est plus compliqué.
    Pour les paramètres il faut mettre à la suite sans espace tous les types de paramètre.
    Pour le type retourné, il faut simplement le type.

    Voici les différents types disponibles :

    • void devient "V"
    • boolean devient "Z"
    • char devient "C"
    • byte devient "B"
    • short devient "S"
    • int devient "I"
    • float devient "F"
    • long devient "J"
    • double devient "D"
    • pour tous les autres type, c'est : L<lien vers la classe (en remplacent les points par des slashs)>; par exemple pour le type String ce serai "Ljava/lang/String;"

    Si vous voulez changer toutes les variables d'une classe, il faut faire ceci :

    <visibilité><chemin vers la classe> *
    

    Pour changer toutes les méthodes d'une classe, il faut faire ceci :

    <visibilité><chemin vers la classe> *()
    

    Une fois que vous avez modifié toutes vos variables et vos méthodes, faites un gradlew setupDecompWorkspace eclipse pour mettre à jour les classes

    Un exemple est disponible sur le github de mon mod tutoriel

    Crédits

    Rédaction :

    • SCAREX

    Correction :


    Ce tutoriel de SCAREX publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    Retour vers le sommaire des tutoriels


  • Rédacteurs

    Tiens tu aime bien gradle décidément 😉 Sinon c'est vrai que ça peut être vraiment utile



  • Ahhhh….Pour moi les Access Transformer, c'était pouvoir accéder aux méthodes du jeu, et les patcher de manière à rajouter ce que l'on veut, où l'on veut dedans 😕
    Sa, je savais déjà faire ^^


  • Administrateurs

    patcher le jeu en profondeur c'est manipulation de byte code avec asm + plugin fml.



  • Sa fera l'objet d'un tutoriel sur le fofo ou pas ? J'irai demander ça en message dans le poste "Proposition de tutoriels"



  • @'BrokenSwing':

    Tiens tu aime bien gradle décidément 😉 Sinon c'est vrai que ça peut être vraiment utile

    C'est pas en rapport avec gradle la, c'est du fml.

    @'Plaigon':

    Sa fera l'objet d'un tutoriel sur le fofo ou pas ? J'irai demander ça en message dans le poste "Proposition de tutoriels"

    Je comptais aussi faire un tuto la dessus mais j'ai pas encore les connaissances pour.



  • Erreur lors du gradlew setupDecompWorkspace, une idée ? Je continue mes recherches…
    public net.minecraft.world.biome.BiomeDecorator func_150513_a(Lnet/minecraft/world/biome/Biome;Lnet/minecraft/world/World;Ljava/util/Random;)V #genDecorations

    (PS = En 1.10.2, l'AT file est bien register dans mon build.gradle, si tu penses que cela vient de là je te filerai le fichier)