RenderPlayerEvent : Modifier le model du joueur



  • Sommaire

    Introduction

    Bonjour à tous! Voici un de mes -rares- tutoriels, sur une fonctionnalité qui pourrait être utile a certain d'entre vous : Modifier le Model du Joueur ! Cela peut-être utilisé pour des animations customs, ou changer la taille du joueur, ou encore même changer complètement le model! (exemple : le mod "Morph" de iChun).

    Attention cependant, si vous modifiez le model sans condition au préalable, cela pourrait causer des incompatibilités. Faites donc comme moi, avec des conditions spécifiques qui déterminent la modification du model. (ex: tenir un item spécifique)

    Pré-requis

    Pour ce tutoriel, il va vous falloir un mod simple, ainsi qu'un Event Handler.

    Code

    EventHandler :

    RenderCustomPlayer playerRenderer;
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void preRenderPlayer(RenderPlayerEvent.Pre event) {
        event.setCanceled(true);
        playerRenderer = new RenderCustomPlayer(event.getRenderer().getRenderManager());
        playerRenderer.doRender((AbstractClientPlayer)event.getEntityPlayer(), 0, 0, 0, 0, 0.0625f);
    }
    

    Ici, rien de compliqué! On crée un Render du model que l'on veut afficher, puis dans l'event qui précède l'affichage du joueur, on annule l'affichage du joueur de base, et à la place, on affiche notre model!

    La ligne doRender prend en argument l'entité, ainsi que les coordonnées, l'orientation, et le float de tick. Ceci sont normalement fournis par le RenderManager du joueur, donc on met des 0, et 0.0625f pour le float.

    Exemple : RenderCustomPlayer

    La classe RenderCustomPlayer que j'utilise pour le tutoriel est enfait très simple : C'est un copié collé de RenderPlayer modifié pour adapter le nouveau model!

    On modifie alors juste le constructeur :

    public RenderCustomPlayer(RenderManager renderManager, boolean useSmallArms)
        {
            super(renderManager, new ModelCustomPlayer(0.0F, useSmallArms), 0.5F);
            //Reste du constructeur
        }
    

    Exemple : ModelCustomPlayer

    Ici, la classe ModelCustomPlayer va nous permettre de modifier les animations, l'apparence etc.. du Model.

    Dans notre cas, c'est simplement un extends du ModelPlayer, avec la méthode setAngles modifiée pour montrer qu'il y a une différence entre le model Vanilla, et notre model custom!

    public class ModelCustomPlayer extends ModelPlayer {
    
        public ModelCustomPlayer(float modelSize, boolean smallArmsIn) {
        super(modelSize, smallArmsIn);
        }
    
        @Override
        public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn)
        {
            super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn);
            copyModelAngles(this.bipedLeftLeg, this.bipedLeftLegwear);
            copyModelAngles(this.bipedRightLeg, this.bipedRightLegwear);
            copyModelAngles(this.bipedLeftArm, this.bipedLeftArmwear);
            copyModelAngles(this.bipedRightArm, this.bipedRightArmwear);
            copyModelAngles(this.bipedBody, this.bipedBodyWear);
    
            this.bipedLeftArm.rotateAngleZ = -0.5f;
            this.bipedRightArm.rotateAngleZ = 1.9f;
            this.bipedLeftLeg.rotateAngleZ = -0.9f;
            this.bipedRightLeg.rotateAngleZ = 0.1f;
        }
    }
    

    Résultat

    Et on obtient donc ... Ceci !

    Crédits

    Rédaction :

    • Gugu

    Correction :

    • Gugu

    Creative Commons
    Ce tutoriel de 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

    retourRetour vers le sommaire des tutoriels



  • Tutoriel corrigé et mis en ligne.



  • Super tutoriel c'est exactement ce que je cherché   🙂
    Mais petite question ce tuto marche en 1.8 ou en 1.7?



  • Je suppose oui, comme je ne crois pas que des choses changent au rendu, essaye toujours.

    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk



  • @'leo01418':

    Super tutoriel c'est exactement ce que je cherché   🙂
    Mais petite question ce tuto marche en 1.8 ou en 1.7?

    Le tutoriel fonctionne également en 1.7 et 1.8.


  • Modérateurs

    
    RenderCustomPlayer playerRenderer;
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void preRenderPlayer(RenderPlayerEvent.Pre event) {
    event.setCanceled(true);
    playerRenderer = new RenderCustomPlayer(event.getRenderer().getRenderManager());
    playerRenderer.doRender((AbstractClientPlayer)event.getEntityPlayer(), 0, 0, 0, 0, 0.0625f);
    }
    
    

    Créer une nouvelle instance d'un objet à chaque fois qu'on veut redessiner le joueur est pas tellement une bonne idée 😕
    Vaudrait mieux la créer dans le "postInit" du mod, non?



  • @'jglrxavpok':

    
    RenderCustomPlayer playerRenderer;
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void preRenderPlayer(RenderPlayerEvent.Pre event) {
       event.setCanceled(true);
       playerRenderer = new RenderCustomPlayer(event.getRenderer().getRenderManager());
       playerRenderer.doRender((AbstractClientPlayer)event.getEntityPlayer(), 0, 0, 0, 0, 0.0625f);
    }
    
    

    Créer une nouvelle instance d'un objet à chaque fois qu'on veut redessiner le joueur est pas tellement une bonne idée 😕
    Vaudrait mieux la créer dans le "postInit" du mod, non?

    Il faut le renderManager donc j'ai pas trouvé d'autre moyen



  • Dans un event de co à un serveur/un monde, ça serait plus logique sinon.



  • et comment modifier le skin car si ont met un model de vache avec un skin de steve . . . .



  • @'NeykoZzHD':

    et comment modifier le skin car si ont met un model de vache avec un skin de steve . . . .

    Tu dois juste bind la texture



  • C'est pas compatible en Multi ça ?


  • Administrateurs

    Render = client donc à faire en @SideOnly(Side.CLIENT).
    Si la modification du modèle du joueur ou non dépend d'une variable, il faut la synchroniser pour que ça fonctionne correctement pour tout le monde.



  • J'ai ce problème en multi avec le changement de rendu

    code: ```java
    RenderCustomPlayer playerRenderer;

    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    void preRenderPlayer(RenderPlayerEvent.Pre event)
    {
    event.setCanceled(true);
    playerRenderer = new RenderCustomPlayer(event.getRenderer().getRenderManager());
    playerRenderer.doRender((AbstractClientPlayer) event.getEntityPlayer(), 0, 0, 0, 0, 0.0625f);
    }

    
    ![](http://i.imgur.com/FAABzqC.png)

  • Administrateurs

    playerRenderer ne devrait pas être une variable global à la classe.



  • Même problème malgré la modification


  • Administrateurs

    Étrange, peut-être que gugu sera d'où ça vient car moi je ne vois pas.



  • Aucune news de la part de gugu 😕



  • Pour empêcher ça mets les positions x,y et z de l'event, comme ça:

    playerRenderer.doRender(event.entityLiving, event.x, event.y, event.z, 0, event.partialRenderTick);
    


  • Nickel ça fonctionne !

    Maintenant j'dois passer par des packets pour update le rendu de mon joueur en temps réel non ? (pour les joueurs au alentours)



  • Je pense que si tout ce qui touche le rendu du joueur est dans ton RenderCustomPlayer ça ne servirai a rien mais que si c'est dans une autre classe alors la oui ç'est nécessaire. Après je ne suis pas expert au niveau des rendu donc je dis peut être des bêtises.