SharedMonsterAttributes variable



  • Salut, me voilà de retour ^^'

    je suis bloqué depuis un moment sur se problème. J'ai un monstre qui pop entre le level 1 a 5. J'aimerais que celon le niveau du mob, des stats lui soit généré, j'ai essayé pas mal de chose, comme passé par des switchs lors de d’attributions des attribues et autres… Mais soit le monstre mourrai au pop, soit il avait la 20 PV et non le bon nombre... Je pensais tenir un truc pas mal du genre :
    this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(Config.HealthArakne * Config.xHealthArakne * this.level); > vie de base * multiplicateur * niveau
    Dès que j'y met la variable this.level, il meurt au spawn... Je sèche et tourne en rond...

    J'ai même essayé avec un worldObj.rand.nextInt() a la place du Math.random mais la même ><

    Merci de m'avoir lu !

    Voici ma classe :

    public class EntityMobArakne extends EntityMob {
    
        public int level;
        public float hitbox;
    
        public EntityMobArakne(World world) {
    
            super(world);
    
            this.level = (int) Math.round(Math.random() * (Config.levelDifArakne - 1)) + Config.levelEcaArakne + Config.levelMinArakne;
            this.hitbox = (float) (Config.sizeArakne + (Config.diffSizeMobs * (this.level - 1)));
            this.setSize(this.hitbox, this.hitbox - 0.45F);
        }
    
        public void setDead() {
            super.setDead();
        }
    
        public void onUpdate()
        {
            this.setCustomNameTag("Arakne Niv." + this.level);
    
            if (worldObj.isRemote)
    {
                System.out.print("Vie = " + this.getMaxHealth() );
            }
    
            super.onUpdate();
        }
    
        @Override
        public void readFromNBT(NBTTagCompound compound) {
            super.readFromNBT(compound);
            compound.getInteger("level");
        }
    
        @Override
        public void writeToNBT(NBTTagCompound compound) {
            super.writeToNBT(compound);
            compound.setInteger("level", this.level);
        }
    
        public Entity findPlayerToAttack() {
            EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, Config.speedAggroArakne);
            return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null;
        }
    
        public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) {
            if (this.isEntityInvulnerable()) {
                return false;
            } else {
                this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(Config.speedAggroArakne);
                return super.attackEntityFrom(p_70097_1_, p_70097_2_);
            }
        }
    
        public void applyEntityAttributes()
    {
            super.applyEntityAttributes();
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(Config.HealthArakne * Config.HealthArakne * this.level);
        }
    }
    
    


  • Regarde à la ligne 163 du EntityLivingBase, c'est ici qu'est appelé la méthode applyEntityAttributes();
    Dans ton cas tu l'appelles donc dans ton constructeur avec le super(world), c'est à dire **avant que tu attribues une valeur à ta variable level.
    **Quand ta méthode applyEntityAttributes() est appelée tu as donc level = 0; d'où ton erreur 😉
    Par conséquent il faut placer l'initialisation de level avant le super(), or cela n'est pas possible (erreur lors de la compilation), donc tu as deux choix:

    • soit tu initialise level dans applyEntityAttributes() avant d'affecter ta valeur à maxHealth
    • soit tu initialise level directement à la ligne où tu déclares cette variable, en dehors du constructeur

    Bonne journée 😉



  • Merci… Je t'avoue que j'ai pas pensé a placer avant le super()... Donc j'ai fait initialiser le level dans applyEntityAttributes() avant d'affecter ta valeur à maxHealth et ça marche !

    Du coup, tout est bon ! TY