Créer un mob qui saute



  • Sommaire

    Introduction

    Aujourd'hui nous allons apprendre à créer un mob qui ne se déplace pas normalement.
    Ce mob sautera pour se déplacer.

    Pré-requis

    Code

    Déjà, vous devez déclarer votre mob dans la classe principale, rien n'a changé.
    Je vous laisse donc déclarer une nouvelle entité que nous nommerons Joomda.

    Créez donc une classe EntityJoomda qui hérite de la classe EntityAmbientCreature (net.minecraft.entity.passive.EntityAmbientCreature), nous allons principalement travailler dans celle-ci.

    EntityJoomda :

    Le constructeur ne change pas :

    public class EntityJoomda extends EntityAmbientCreature {
    
        public EntityJoomda(World par1World) {
            super(par1World);
        }
    }
    

    Votre entité peut désormais être utilisée, mais elle sera une entité de base, sans aucun modèle ni rien.

    Ajoutez la méthode onUpdate() :

        public void onUpdate() {
            super.onUpdate();
    
            if (this.worldObj.getTotalWorldTime() % 80 == 0) {
                if (this.onGround) {
                    this.jump();
                }
            }
        }
    

    Je vais tout expliquer petit à petit.

    public void onUpdate() {
    

    Tout le monde doit comprendre cette ligne je pense.

    super.onUpdate();
    

    Cette ligne est essentielle si vous souhaitez que votre mob marche normalement. Vous pouvez faire CTRL + Clic gauche pour voir la méthode onUpdate() de EntityAmbientCreature.

    if (this.worldObj.getTotalWorldTime() % 80 == 0) {
    

    Cette condition n'est vraie que lorsque le nombre de ticks du monde actuel divisé par 80 n'a aucun reste (le modulo, que vous devez connaître). Cette condition n'est vraie qu'une fois toutes les 4 secondes (1 seconde = 20 ticks), vous pouvez donc changer cette valeur si vous souhaitez que le mob saute plus ou moins souvent.

                if (this.onGround) {
                    this.jump();
    

    Si le mob est au sol, on appelle la méthode qui le fera sauter. Cette condition est obligatoire car si le mob est en l'air il va sauter, ce qui fait quelque chose qui n'est absolument pas réaliste. Si vous tapez ce mob juste avant qu'il saute il n'y aura aucun problème avec cette condition. Vous pouvez très bien l'enlever et tester, mais le résultat sera moche.

    Normalement votre mob est utilisable, mais il ne sautera que de façon verticale, il ne bougera pas. Vous pouvez parer ce problème avec cette méthode :

        protected void jump()
        {
            this.motionY = 0.41999998688697815D;
    
            if (this.isPotionActive(Potion.jump))
            {
                this.motionY += (double)((float)(this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F);
            }
    
            float f = this.rotationYaw * 0.017453292F;
            this.motionX -= (double)(MathHelper.sin(f) * 0.5F);
            this.motionZ += (double)(MathHelper.cos(f) * 0.5F);
    
            this.isAirBorne = true;
            ForgeHooks.onLivingJump(this);
        }
    

    Expliquons cette méthode également ligne par ligne :

    this.motionY = 0.41999998688697815D;
    

    Cet élément permettra de choisir la hauteur de saut, une valeur trop grande fera sauter le mob trop haut et il despawnera. Une valeur élevée peut aussi infliger de grands dégâts au mob lorsqu'il sautera. Je vous conseille donc de ne pas toucher à cette valeur.

            if (this.isPotionActive(Potion.jump))
            {
                this.motionY += (double)((float)(this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F);
            }
    

    Cette condition permet d'augmenter la hauteur de saut si le mob a l'effet Jump actif. Cette condition est la condition de la fonction Jump de Minecraft de base.

            float f = this.rotationYaw * 0.017453292F;
            this.motionX -= (double)(MathHelper.sin(f) * 0.5F);
            this.motionZ += (double)(MathHelper.cos(f) * 0.5F);
    
            this.isAirBorne = true;
            ForgeHooks.onLivingJump(this);
    

    Le float f est intégré à la méthode de base mais je ne sais pas à quoi il sert, si vous savez son utilité, merci de me prévenir en réponse ^^
    motionX et motionZ permettent respectivement de modifier le déplacement en X et en Z lors du saut.
    this.isAirBorne = true permet de signaler à Minecraft que le mob est en train de voler.
    La dernière ligne permet de faire sauter le mob.

    ModelJoomda :

    Ce model est mon œuvre, si vous souhaitez l'utiliser merci de me citer.

    import net.minecraft.client.model.ModelBase;
    import net.minecraft.client.model.ModelRenderer;
    import net.minecraft.entity.Entity;
    
    public class ModelJoomda extends ModelBase
    {
        //fields
        ModelRenderer Base;
        ModelRenderer Foot;
        ModelRenderer Head;
    
        public ModelJoomda()
        {
            textureWidth = 32;
            textureHeight = 32;
    
            Base = new ModelRenderer(this, 0, 0);
            Base.addBox(-2.533333F, 0F, -2.466667F, 5, 1, 5);
            Base.setRotationPoint(0F, 23F, 0F);
            Base.setTextureSize(32, 32);
            Base.mirror = true;
            setRotation(Base, 0F, 0F, 0F);
            Foot = new ModelRenderer(this, 0, 6);
            Foot.addBox(-1.5F, 0F, -1.533333F, 3, 16, 3);
            Foot.setRotationPoint(0F, 8F, 0F);
            Foot.setTextureSize(32, 32);
            Foot.mirror = true;
            setRotation(Foot, 0F, 0F, 0F);
            Head = new ModelRenderer(this, 12, 6);
            Head.addBox(-0.5F, -8F, -3.5F, 1, 8, 7);
            Head.setRotationPoint(0F, 8F, 0F);
            Head.setTextureSize(32, 32);
            Head.mirror = true;
            setRotation(Head, 0F, 4.8F, 0F);
        }
    
        public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
        {
            super.render(entity, f, f1, f2, f3, f4, f5);
            setRotationAngles(f, f1, f2, f3, f4, f5, entity);
            Base.render(f5);
            Foot.render(f5);
            Head.render(f5);
        }
    
        private void setRotation(ModelRenderer model, float x, float y, float z)
        {
            model.rotateAngleX = x;
            model.rotateAngleY = y;
            model.rotateAngleZ = z;
        }
    
        public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
        {
            super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
        }
    
    }
    

    Je n'expliquerai pas le code, c'est un code généré par Techne que j'ai modifié pour qu'il fonctionne.

    RenderJoomda :

    import fr.minecraftforgefrance.modtutoriel.ModTutoriel;
    import net.minecraft.client.model.ModelBase;
    import net.minecraft.client.renderer.entity.RenderLiving;
    import net.minecraft.entity.Entity;
    import net.minecraft.util.ResourceLocation;
    
    public class RenderJoomda extends RenderLiving {
    
        public RenderJoomda(ModelBase par1ModelBase, float par2) {
            super(par1ModelBase, par2);
        }
    
        @Override
        protected ResourceLocation getEntityTexture(Entity var1) {
            return new ResourceLocation("modtutoriel", "textures/entity/joomda.png");
        }
    }
    

    Je vais juste expliquer cette fonction :

        @Override
        protected ResourceLocation getEntityTexture(Entity var1) {
            return new ResourceLocation("modtutoriel", "textures/entity/joomda.png");
        }
    

    Les première et deuxième ligne n'ont pas besoin d'explication.
    Le premier argument de la 3e ligne est le modid, que vous devez remplacer selon votre modid. Ensuite le deuxième argument signifie le chemin d'accès de la texture du model à partir du dossier assets/votremodid.

    Vous pouvez télécharger la texture ici.

    Vous devez ensuite enregistrer votre model dans la classe ClientProxy.

    Résultat

    Crédits

    Rédaction :

    Correction :

    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 très intéressant qui m'est passé inaperçu (désolé du up) ^^ Merci @Pchom ! 🙂



  • Peut on utiliser un .obj ? Si oui comment ?





  • Merci beaucoup 🙂
    edit: Il semblerai que cet lib soit outdated .. 😕 Y a t il autre chose ?



  • Tu peux sinon lire ce poste où l'auteur utilise uniquement forge et pas glutils : https://www.minecraftforgefrance.fr/showthread.php?tid=560



  • @'MisterAlex95':

    Merci beaucoup 🙂
    edit: Il semblerai que cet lib soit outdated .. 😕 Y a t il autre chose ?

    Si tu utilises une version supérieure à la 1.7 tu dois pouvoir utiliser des .obj nativement sinon il y a plein de librairies sur internet



  • En fait je me suis mal exprimé. Je cherche a modifier un model de mob grace a un .obj.
    Je trouve ça nul part, est ce que c'est possible ?



  • Remplacer le model d'un mob déjà existant par un .obj, c'est bien cela ?



  • Non plutot créer un nouveau mob et utiliser un .obj comme model
    Impossible de trouver comment faire 😕



  • Heureusement que j'ai voulu, y'a pas mal de temps, faire la même chose que toi 🙂
    https://www.minecraftforgefrance.fr/archive/index.php?thread-2985.html



  • @'Plaigon':

    Heureusement que j'ai voulu, y'a pas mal de temps, faire la même chose que toi 🙂
    https://www.minecraftforgefrance.fr/archive/index.php?thread-2985.html

    il y a t il un moyen de te contacter plus facilement ? 🙂



  • Non, le but d'un forum est d'utiliser les postes afin de résoudre les problèmes. Si on finit par résoudre le problème sur skype/discord/ts sans laisser de traces aux futurs membres en difficultes, cela n'aura servi à rien…

    De plus, je vois difficilement comme t'aider davantage vu le lien que je t'ai déniché: tout le code est déjà servi, t'as plus qu'à faire un copier coller ^^'



  • D'accord, merci en tout cas 🙂
    Il semblerai qu'en 1.10.2 il n'y ai plus IModelCustom ainsi que [color=#000000AdvancedModelLoader… qu'est ce qui les remplace actuellement ? ]



  • Les fichiers json