Créer une monture attitude + son


  • Correcteurs

    Voilà, je cherche à faire des véhicules custom, type kart/moto/autres modèles via techne pour faire mumuse dans la ville…

    J'arrive à faire une Entité extends EntityHorse (parce que via EntityAnimal ça fait n'imp à tomber dans le sol et n'est plus montable).

    Voici mon code actuel de la classe:

    Donc j'ai en fait une monture qui fait tout comme un cheval mais qui ressemble à un véhicule...
    J'ai cru comprendre pour le son que c'est via .json dans un fichier sounds au même emplacement que "assets", maintenant je ne sais pas faire jouer ce son (j'avais bidouiller une fonction en fall qui en sautant devait faire un son mais la console disait un truc comme "tu rêves ça va pas marcher là")

    Si quelqu'un sait comment faire en sorte que la monture reste statique, ne "galope" pas quand on avance avec, ne hennis pas quand on le frappe et puis évite de se balader en mode batmobile quand on est plus dessus =/ (le fait de lui faire Play un sound quand on avance serait un bonus très apprécié)

    (Au bout de 3heures de recherches en général je m'en remet à vous)
    Cordialement,


  • Administrateurs

    Si tu veux faire jouer le son quand tu monte sur le Kart par exemple :

    
    worldObj.playSoundAtEntity(this, "tonmodid:nom.du.son.comme.dans.le.json", 1.0F, 1.0F); // le premier 1.0F signifie le volume, et l'autre le pitch. Ou inversement, de toute manière c'est écrit si tu passe ton curseur dessus sous eclipse.
    
    

  • Correcteurs

    @'elias54':

    Si tu veux faire jouer le son quand tu monte sur le Kart par exemple :

    
    worldObj.playSoundAtEntity(this, "tonmodid:nom.du.son.comme.dans.le.json", 1.0F, 1.0F); // le premier 1.0F signifie le volume, et l'autre le pitch. Ou inversement, de toute manière c'est écrit si tu passe ton curseur dessus sous eclipse.
    
    

    Yep, alors visiblement ça fonctionne mais je dois mal placer mes fichiers dans les dossiers.
    J'ai un dossier "sound" créé dans le même dossier que celui qui contient "mcmod.info".
    Dans ce dossier "sound" j'ai mon sounds.json et mon moteur.ogg

    Le message que j'ai en montant sur la monture est :
    [12:03:14] [Client thread/WARN]: Unable to play unknown soundEvent: modhc:moteur

    Je dois faire une erreur de synthaxe mais à quel endroit?


  • Administrateurs

    Dans le fichier sounds.JSON remplace Modhc":"moteur" par moteur":"moteur"
    À gauche c'est le nom pour jouer le son et non le modid. À droite c'est le nom du fichier.


  • Correcteurs

    Non décidément ça ne veut pas, j'ai essayé de déplacer les fichiers car visiblement ça ne trouve pas le fichier.

    Au final voici la classe de mon véhicule.
    J'ai réussis à couper à peu près tous les sons dérangeants qu'est sensé produire un cheval IG, après avoir tenté de modifier dans le .json la partie que tu m'as dis Robin.

    Edit

    Je laisse le cette fonction à 1.0F le temps de tester si mon son est bien mis, sinon en le coupant cela enlève les bruits de respiration du cheval (seule façon que j'ai trouvé actuellement)
      ```java
    protected float getSoundVolume()
        {
            return 1.0F;
        }

    
    Voilà, j'ai pu voir un mod appelé dirt Bike (qui m'a donné l'envie de faire des véhicules), j'ai pu voir que les fichiers sound et sounds.json sont avec les textures et fichier lang, en les mettant là ça me marquait:
    [font=Ubuntu, sans-serif[Client thread/WARN]: Unable to play Empty soundEvent: modhc:moteur]
    
    Edit:
    Le son est secondaire, ce qui me préoccupe le plus maintenant c'est de pouvoir modifier la vitesse du véhicule
    En utilisant:
    ```java
     public void onEntityUpdate()
     {
      this.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 1, 1));
    }  
    

    J'ai eu la mauvaise surprise de voir mon véhicule reset le rendu à chaque tick ce qui faisait que, si je ne regardais pas vers le sud, mon véhicule tournait comme une toupie folle.


  • Administrateurs

    Le bon fichier json :

    {
    "moteur": {
    "category": "master",
    "sounds": [
    {
    "name": "moteur",
    "stream": true
    }
    ]
    }
    }
    

    stream si le son est long, sinon false. Le fichier doit être au format ogg et doit se trouver dans le dossier assets/modid/sounds (avec un s).

    Pour la vitesse -> il faut utiliser les attribues.


  • Administrateurs

    Si le setBaseValue fonctionne pas, va falloir utiliser les UUID des Attributes… 😕 Et là c'est tout un autre système dont je ne saurais te donner de réponse. (Le zombie a un UUID pour chaque attribute modifiers...)


  • Correcteurs

    @'robin4002':

    Le bon fichier json :

    {
     "moteur": {
       "category": "master",
       "sounds": [
         {
           "name": "moteur",
           "stream": true
         }
       ]
     }
    }
    

    stream si le son est long, sinon false. Le fichier doit être au format ogg et doit se trouver dans le dossier assets/modid/sounds (avec un s).

    Pour la vitesse -> il faut utiliser les attribues.

    Parfait pour le son (je précise pour les futurs moddeurs en herbe qui passent que le json est aussi situé avec les fichiers lang, textures et sounds.)

    Du coup pour la vitesse moi j'ai:

    public void applyEntityAttributes()
        {
            super.applyEntityAttributes();
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3.0D);    
            this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.699999988079071D);
        }  
    

    En mettant .SetBaseValue(6D) par exemple je n'ai aucun changement notable. Je me trompe en essayant d'augmenter la vitesse comme ça?

    Edit: Ah bah je vais chercher de ce côté alors à tâton.

    Edit2: Voici ce que je trouve pour le moment ```java
        private static final UUID sprintingSpeedBoostModifierUUID = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D");

    private static final AttributeModifier sprintingSpeedBoostModifier = (new AttributeModifier(sprintingSpeedBoostModifierUUID, "Sprinting speed boost", 2D, 2)).setSaved(false);

    ```java
    public void applyEntityAttributes()
        {
            super.applyEntityAttributes();
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3.0D);    
            this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.4D);
        }  
    
        public void setSprinting(boolean p_70031_1_)
        {
            super.setSprinting(p_70031_1_);
            IAttributeInstance iattributeinstance = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed);
    
            if (iattributeinstance.getModifier(sprintingSpeedBoostModifierUUID) != null)
            {
                iattributeinstance.removeModifier(sprintingSpeedBoostModifier);
            }
    
            if (p_70031_1_)
            {
                iattributeinstance.applyModifier(sprintingSpeedBoostModifier);
            }
        }
    

    Je poursuis sur cette voie ou c'est mal barré?


  • Administrateurs

    Tu peux pas utiliser cet UUID, elle est déjà utilisé par le mob en question. Va falloir trouver celle de ton entité 😕


  • Correcteurs

    @'elias54':

    Tu peux pas utiliser cet UUID, elle est déjà utilisé par le mob en question. Va falloir trouver celle de ton entité 😕

    Et techniquement je dois regarder de quel côté? ça se déclare?
    plonge dans un océan d'ignorance


  • Administrateurs

    @'Toutoune1008':

    @'elias54':

    Tu peux pas utiliser cet UUID, elle est déjà utilisé par le mob en question. Va falloir trouver celle de ton entité 😕

    Et techniquement je dois regarder de quel côté? ça se déclare?
    plonge dans un océan d'ignorance

    Je comprend les UUID des joueurs mais ceux des mobs c'est un système modifié et utilisé bizarrement par mojang, donc moi même j'ai pas encore compris.


  • Correcteurs

    Et je pourrais plutôt passer par des effets de potions au pire?
    Créer un event ou un truc du genre qui contournerait l'Attributes…



  • Nop les event ne changeront rien. A ma connaissance Forge 1.7 x ne possède pas d'event appelé lorsqu'une entity bouge. La solution de la potion n'est pas si mauvaise, après si le fait de voir les particules te dérange, faudra encore trouver autre chose ^^'


  • Correcteurs

    @'Julot10085':

    Nop les event ne changeront rien. A ma connaissance Forge 1.7 x ne possède pas d'event appelé lorsqu'une entity bouge. La solution de la potion n'est pas si mauvaise, après si le fait de voir les particules te dérange, faudra encore trouver autre chose ^^'

    D'acc, je dois passer par quelle fonction pour appliquer mon effet de potion à l'entité stp?

    Edit:

    Ah oui, petit tracas aussi, mon véhicule se promène par-ci par-là comme un animal basique évidemment, j'ai essayé de trouver quelle fonction fournissait l'IA pour ça ou autre et souvent en modifiant l'animal ne bougeait tout simplement plus du tout (surtout monté) donc si vous avez une piste je suis preneur, merci.



  • @'elias54':

    @'Toutoune1008':

    @'elias54':

    Tu peux pas utiliser cet UUID, elle est déjà utilisé par le mob en question. Va falloir trouver celle de ton entité 😕

    Et techniquement je dois regarder de quel côté? ça se déclare?
    plonge dans un océan d'ignorance

    Je comprend les UUID des joueurs mais ceux des mobs c'est un système modifié et utilisé bizarrement par mojang, donc moi même j'ai pas encore compris.

    Les UUID sont utilisés pour gagner en performance réseau.
    Lorsqu'on parle d'une entité, le serveur et les clients s'échange un nombre. C'est bien plus performant que de s'échanger une version sérialisée de l'objet 😉


  • Correcteurs

    Bon aux dernières nouvelles j'arrive à faire que le kart arrête de se balader mais il continue à tourner un peu sur lui à chercher à gauche et à droite.

    Si quelqu'un a une idée pour empêcher ça 😃


  • Administrateurs

    @'Toutoune1008':

    Bon aux dernières nouvelles j'arrive à faire que le kart arrête de se balader mais il continue à tourner un peu sur lui à chercher à gauche et à droite.

    Si quelqu'un a une idée pour empêcher ça 😃

    motionX = motionY = motionZ = 0.0F; quand il est en idle.



  • C'est pas plutôt rotationYaw et rotationPitch, pour qu'il s'arrête de tourner sur lui même ?


  • Correcteurs

    Pour le moment ma classe c'est:

    public  class EntityKart extends EntityHorse
    {
    private int field_110285_bP;
    private boolean field_110294_bI;
    
        public EntityKart(World model)
        {
        super(model);
        }
    
        protected boolean isMovementCeased()
        {
            return true;
        }
    
        protected boolean isAIEnabled()
        {
            return false;
        }
    
        public void playLivingSound()
        {
        worldObj.playSoundAtEntity(this, "modhc:klaxon", 1.0F, 1.0F);
        }
    
    public double getMountedYOffset()
        {
            return (double)this.height * 0.15D;
        }
    
        public void applyEntityAttributes()
        {
            super.applyEntityAttributes();
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3.0D);    
            this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(10.0D);
        }  
    
    public boolean canBeSteered()
        {
            return true;
        }
    
        public boolean isHorseSaddled()
        {
            return true;
        }
    
    // public boolean isTame()
    //    {
    //        return true;
    //    }
    
        public boolean setTamedBy(EntityPlayer p_110263_1_)
        {
            this.func_152120_b(p_110263_1_.getUniqueID().toString());
            this.setHorseTamed(true);
            return true;
        }
    
        public boolean isChested()
        {
            return false;
        }
    
        public boolean isEatingHaystack()
        {
            return false;
        }
    
        public boolean isRearing()
        {
            return false;
        }
    
        public boolean func_110205_ce()
        {
            return false;
        }
    
        public boolean getHasReproduced()
        {
            return false;
        }
    
        public boolean allowLeashing()
        {
            return false;
        }
    
        public boolean canBePushed()
        {
            return true;
        }
    
        public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_)
        {
            Entity entity = p_70097_1_.getEntity();
            return this.riddenByEntity != null && this.riddenByEntity.equals(entity) ? false : super.attackEntityFrom(p_70097_1_, p_70097_2_);
        }
    
        protected Item getDropItem()
        {
            return null;
        }
    
        protected float getSoundVolume()
        {
            return 0.0F;
        }
    
        public boolean canBreatheUnderwater()
        {
            return false;
        }
    
        protected int getExperiencePoints(EntityPlayer p_70693_1_)
        {
                return this.experienceValue = 0;
        }
    
        public void openGUI(EntityPlayer p_110199_1_)
        {
            if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == p_110199_1_) && this.isTame())
            {
            worldObj.playSoundAtEntity(this, "modhc:klaxon", 1.0F, 1.0F);
            }
        }
    
        public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_)
        {
            if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase && this.isHorseSaddled())
            {
                this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
                this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
                this.setRotation(this.rotationYaw, this.rotationPitch);
                this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
                p_70612_1_ = ((EntityLivingBase)this.riddenByEntity).moveStrafing * 0.5F;
                p_70612_2_ = ((EntityLivingBase)this.riddenByEntity).moveForward;
    
                if (p_70612_2_ <= 0.0F)
                {
                    p_70612_2_ *= 0.25F;
                    this.field_110285_bP = 0;
                }
    
                if (this.onGround && this.jumpPower == 0.0F && this.isRearing() && !this.field_110294_bI)
                {
                    p_70612_1_ = 0.0F;
                    p_70612_2_ = 0.0F;
                }
    
                if (this.jumpPower > 0.0F && !this.isHorseJumping() && this.onGround)
                {
                    this.motionY = this.getHorseJumpStrength() * (double)this.jumpPower;
    
                    if (this.isPotionActive(Potion.jump))
                    {
                        this.motionY += (double)((float)(this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F);
                    }
    
                    this.setHorseJumping(true);
                    this.isAirBorne = true;
    
                    if (p_70612_2_ > 0.0F)
                    {
                        float f2 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
                        float f3 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
                        this.motionX += (double)(-0.4F * f2 * this.jumpPower);
                        this.motionZ += (double)(0.4F * f3 * this.jumpPower);
                        this.playSound("mob.horse.jump", 0.0F, 0.0F); //Son au moment du son
                    }
    
                    this.jumpPower = 0.0F;
                    net.minecraftforge.common.ForgeHooks.onLivingJump(this);
                }
    
                this.stepHeight = 1.0F;
                this.jumpMovementFactor = this.getAIMoveSpeed() * 0.1F;
    
                if (!this.worldObj.isRemote)
                {
                    this.setAIMoveSpeed((float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue());
                    super.moveEntityWithHeading(p_70612_1_, p_70612_2_);
                }
    
                if (this.onGround)
                {
                    this.jumpPower = 0.0F;
                    this.setHorseJumping(false);
                }
    
                this.prevLimbSwingAmount = this.limbSwingAmount;
                double d1 = this.posX - this.prevPosX;
                double d0 = this.posZ - this.prevPosZ;
                float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F;
    
                if (f4 > 1.0F)
                {
                    f4 = 1.0F;
                }
    
                this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
                this.limbSwing += this.limbSwingAmount;
            }
            else
            {
                this.stepHeight = 0.5F;
                this.jumpMovementFactor = 0.02F;
                super.moveEntityWithHeading(p_70612_1_, p_70612_2_);
            }
        }
    
        protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_)
        {
            Block.SoundType soundtype = p_145780_4_.stepSound;
    
            if (this.worldObj.getBlock(p_145780_1_, p_145780_2_ + 1, p_145780_3_) == Blocks.snow_layer)
            {
                soundtype = Blocks.snow_layer.stepSound;
            }
    
            if (!p_145780_4_.getMaterial().isLiquid())
            {
                int l = this.getHorseType();
    
                if (this.riddenByEntity != null && l != 1 && l != 2)
                {
                    ++this.field_110285_bP;
    
                    if (this.field_110285_bP > 5 && this.field_110285_bP % 3 == 0)
                    {
                        this.playSound("mob.horse.gallop", soundtype.getVolume() * 0.0F, soundtype.getPitch()); //son activé souvent
    
                        if (l == 0 && this.rand.nextInt(10) == 0)
                        {
                            this.playSound("mob.horse.breathe", soundtype.getVolume() * 0.0F, soundtype.getPitch());
                        }
                    }
                    else if (this.field_110285_bP <= 5)
                    {
                        this.playSound("mob.horse.wood", soundtype.getVolume() * 0.0F, soundtype.getPitch());
                    }
                }
                else if (soundtype == Block.soundTypeWood)
                {
                    this.playSound("mob.horse.wood", soundtype.getVolume() * 0.0F, soundtype.getPitch());
                }
                else
                {
                    this.playSound("mob.horse.soft", soundtype.getVolume() * 0.0F, soundtype.getPitch());
                }
            }
        }
    
        protected void fall(float p_70069_1_)
        {
            if (p_70069_1_ > 1.0F)
            {
            this.playSound("modhc:moteur", 0.4F, 1.0F);
            }
    
            int i = MathHelper.ceiling_float_int(p_70069_1_ * 0.5F - 3.0F);
    
            if (i > 0)
            {
                this.attackEntityFrom(DamageSource.fall, (float)i);
    
                if (this.riddenByEntity != null)
                {
                    this.riddenByEntity.attackEntityFrom(DamageSource.fall, (float)i);
                }
    
                Block block = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - 0.2D - (double)this.prevRotationYaw), MathHelper.floor_double(this.posZ));
    
                if (block.getMaterial() != Material.air)
                {
                    Block.SoundType soundtype = block.stepSound;
                    this.worldObj.playSoundAtEntity(this, soundtype.getStepResourcePath(), soundtype.getVolume() * 0.0F, soundtype.getPitch() * 0.0F);
                }
            }
        }    
    
    public boolean interact(EntityPlayer par1EntityPlayer)
      {
          if (super.interact(par1EntityPlayer))
          {
          worldObj.playSoundAtEntity(this, "modhc:moteur", 1.0F, 1.0F);
          par1EntityPlayer.mountEntity(this);
          return true;
          }
          return false;
      }
    
    @Override
    public EntityAgeable createChild(EntityAgeable p_90011_1_) {
    return null;
    }
    }
    

    Donc je dois toucher à quoi où?
    J'avais tester de toucher le pitch etc, le problème étant que cela empêchait tout mouvement.
    Où se situe la ligne où mon kart est en idle stp?


  • Administrateurs

    C'est dans on living update que je parlais de mettre ce que j'ai cité.

    tu te débrouille avec une condition après