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
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 -
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.
-
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 ?
-
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)
-
playerRenderer ne devrait pas être une variable global à la classe.
-
Même problème malgré la modification
-
É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.
-