[1.15.X] Utiliser la classe ObfuscationReflectionHelper


  • Salut les moddeurs, l'API Forge met à disposition des utilisateurs un tas de petits outils permettant d'aller encore plus loin dans la modification du jeu. Ce tutoriel sera rédigé dans la version 1.15.2 de Minecraft pour faciliter la compréhension mais il n'est absolument pas réservé qu'à celle-ci.

    Sommaire

    Prérequis

    • Des connaissances correctes en Java

    Principe de la classe

    Cette classe, bien que très peu utilisée, permet d'accéder à des variables privées pour effectuer toutes sortes d'actions avec celles-ci. Il faut cependant faire très attention à respecter quelques règles pour éviter de créer des problèmes avec le fonctionnement de Minecraft. Nous allons dans ce tutoriel utiliser les deux méthodes les plus importantes de la classe et essayer de comprendre à quoi elles peuvent nous être utiles.

    Savoir se servir des fonctions

    La première méthode que nous allons voir, nommée sobrement getPrivateValue permet comme son nom l'indique de récupérer directement la variable d'une classe à partir d'une instance de celle-ci.

    A savoir que la classe n'utilise que des instances pour fonctionner.

    Le tout premier paramètre de la fonction représente simplement la classe qu'on souhaite accéder, le second représente une instance de cette dernière classe, et pour le dernier il faut rentrer le nom SRG de la variable. Ainsi la fonction vous retournera cette même variable et vous pourrez vous en servir comme bon vous semble.

    Si vous avez besoin de retrouver le nom SRG d'une variable ou d'une méthode je vous invite à aller voir les mappings MCP disponibles au téléchargement sur Internet ou encore dans les libraries de votre projet.

    Voici un petit exemple d'utilisation de la méthode.

    package com.twiguinou.tuto;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.entity.CowRenderer;
    import net.minecraft.client.renderer.entity.LivingRenderer;
    import net.minecraft.client.renderer.entity.layers.LayerRenderer;
    import net.minecraft.client.renderer.entity.model.CowModel;
    import net.minecraft.entity.passive.CowEntity;
    import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
    
    import java.util.List;
    
    public class ClientProxy {
        
        public void client() {
            Minecraft mc = Minecraft.getInstance();
            List<LayerRenderer<CowEntity, CowModel<CowEntity>>> layerRenderers = ObfuscationReflectionHelper.getPrivateValue(LivingRenderer.class, new CowRenderer(mc.getRenderManager()), "field_177097_h");
            /*
            * Je peux par exemple ajouter un LayerRenderer sur la vache! Attention à bien utiliser cette fonction sur le bon côté ( client / serveur )
             */
        }
        
    }
    

    Poursuivons avec la seconde fonction. Celle-ci est plus intéressante, elle permet de modifier la valeur associée à une variable, et non pas d'en récupérer simplement le contenu qu'elle soit privée ou finale, par la même occasion et comme avec la précédente fonction cette même variable restera libre de modification durant toute la durée de vie du programme.
    Donc cette méthode setPrivateValue va prendre cette fois-ci quatre paramètres qui sont les suivants:

    • La classe à accéder
    • Une instance de celle-ci
    • La nouvelle valeur de la variable
    • Le nom SRG de la variable

    Voici un autre exemple d'utilisation de la méthode.

    package com.twiguinou.tuto;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.entity.CowRenderer;
    import net.minecraft.client.renderer.entity.LivingRenderer;
    import net.minecraft.client.renderer.entity.model.CowModel;
    import net.minecraft.entity.passive.CowEntity;
    import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
    
    public class ClientProxy {
    
        public void client() {
            Minecraft mc = Minecraft.getInstance();
            ObfuscationReflectionHelper.setPrivateValue(LivingRenderer.class, new CowRenderer(mc.getRenderManager()), new CowModel<CowEntity>(), "field_77045_g");
            /*
            * Ceci n'est qu'un exemple, faire ceci n'aura absolument aucun effet sur le modèle de l'entité.
             */
        }
    
    }
    

    Ce ne sont bien évidemment pas les seules fonctions disponibles dans la classe, il en existe bien d'autres mais j'ai décidé de ne vous présenter que les plus utiles.

    Exemple d'utilisation

    Si ces méthodes peuvent sembler légèrement abstraites dans un mod, les possibilités qu'offre ces dernières peuvent servir à beaucoup d'applications.
    Voici quelques exemples d'utilisation de ces deux méthodes permettant de modifier complétement, et sans event le modèle du joueur:
    2020-05-26_15.50.23.png
    2020-05-26_15.48.25.png

    Conclusion

    Bien que très performantes, les méthodes de cette classe ne doivent pas être utilisées en masse car cela peut poser un tas de problèmes de compatibilité avec d'autres mods, c'est pour ça que Forge met à disposition des events pour faciliter les choses. Je vous invite donc à utiliser cette classe seulement si vous savez ce que vous voulez faire avec.

    Licence et attribution

    88x31.png
    Ce tutoriel rédigé par Twiguinou et 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


  • Super tutoriel, très intéressant et utile ^^ !


  • Merci beaucoup ! D'autant plus que c'est mon premier donc j'ai essayé d'être le plus précis possible dans ce que je disais.


  • Ouais très bon tuto bravo.