Source des dégâts/EntityThrowable


  • Correcteurs

    Salut les gens,

    Aujourdh'ui j'aimerais demander votre aide concernant la source des dégâts de certaines de mes entités.
    Ce sont des entités tirées par mes armes, des balles donc.

    Mon principal soucis est que la source des dégâts à l'impact est l'entité et non pas le joueur. Cela me pose pas mal de soucis une fois sur le serveur mais également dans mes achievements (où il faut que la source soit le joueur).

    La méthode dont je me sers pour appliquer les dégâts est:

    @Override
        protected void onImpact(MovingObjectPosition mop)
        {
            if(mop.entityHit != null)
            {
                if (mop.entityHit instanceof EntityLivingBase)
                {
                    mop.entityHit.attackEntityFrom(EntityDamageSource.anvil, strength);
                }
                else
                {
                    mop.entityHit.attackEntityFrom(EntityDamageSource.anvil, strength);
                }
                setDead();
            }
            else
            {
                setDead();
            }
        }
    

  • Administrateurs

    DamageSource damage = new EntityDamageSourceIndirect("nom", this, entityQuiATiré)).setProjectile();

    Pour faire passer le joueur dans la classe de ton entity fait la mettre dans le constructeur.


  • Correcteurs

    J'ai remplacé la source des dégâts. Apparemment c'est comme pour les flèches ce bout de code

    Voici mes constructeurs (sans y avoir retouché), normalement c'est le paramètre EntityLivingBase throwerIn qui définit qui a lancé mais je ne sais pas la mettre en paramètre pour mon DamageSource.
    Jj'ai plutôt mis Minecraft.getMinecraft().thePlayer., qui fonctionne tout aussi bien je crois. (en tout cas dans les logs c'est le joueur qui est appelé)

    package fr.powergame.modpg2.common;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.projectile.EntityThrowable;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.EntityDamageSourceIndirect;
    import net.minecraft.util.MathHelper;
    import net.minecraft.util.MovingObjectPosition;
    import net.minecraft.world.World;
    
    public class EntityBullet extends EntityThrowable
    {
        public float strength;
        public int ticksAlive;
    
        public EntityBullet(World worldIn)
        {
            super(worldIn);
            strength = 7.5F;
            this.setSize(0.3F, 0.3F);
            this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.func_70182_d(), 1.0F);
        }
    
        public EntityBullet(World worldIn, EntityLivingBase throwerIn)
        {
            super(worldIn, throwerIn);
            strength = 7.5F;
            this.setSize(1.0F, 1.0F);
            this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.func_70182_d(), 1.0F);
        }
    
        public EntityBullet(World worldIn, double x, double y, double p_i1778_6_)
        {
            super(worldIn, x, y, p_i1778_6_);
            strength = 7.5F;
            this.setSize(1.0F, 1.0F);
            this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.func_70182_d(), 1.0F /*Précision du tir!*/);
        }
    
        public void setArrowHeading(double d, double d1, double d2, float spread, float speed)
        {
           […] // Le calcul
    
        }
    
        @Override
        protected void onImpact(MovingObjectPosition mop)
        {
            DamageSource damage = new EntityDamageSourceIndirect("Plasma", this, Minecraft.getMinecraft().thePlayer).setProjectile();
            if(mop.entityHit != null)
            {
                float l = strength;
                if (mop.entityHit instanceof EntityLivingBase)
                {
                    mop.entityHit.attackEntityFrom(damage, l);
                }
                else
                {
                    mop.entityHit.attackEntityFrom(damage, l);
                }
                setDead();
            }
            else
            {
                setDead();
            }
        }
    
        public void onUpdate()
        {
          […] // Des choses
        }
    
        protected float getGravityVelocity()
        {
            return 0.0F;
        }
    }
    


  • Sinon tu fais un getter pour récupérer le joueur

    public EntityLivingBase getThrower() {
    return this.throwerIn;
    }
    

  • Correcteurs

    ça me demande de créer soit un field soit une constante à propos du throwerIn
    Je pensais que le fait d'être dans le constructeur suffirait.


  • Administrateurs

    En haut de la classe :
    private EntityLivingBase thrower;

    Et dans le deuxième constructeur :
    this.thrower = throwerIn;

    Et ensuite tu aura juste à utiliser this.thrower.

    Si tu utilises Minecraft.getMinecraft().thePlayer tu vas te manger un NoClassDefFoundException avec un serveur.


  • Correcteurs

    Ouki ça marche, ça m'en apprend un peu plus sur le fonctionnement des constructeurs, merci les gars.



  • Je vais regarder plus en détail quand j'aurai le temps, sinon ça sert à quoi ce bout de ton code ? :

    
    1.  **if** (mop.entityHit **instanceof** EntityLivingBase)
    2.              {
    3.                  mop.entityHit.attackEntityFrom(damage, l);
    4.              }
    5.              **else**
    6.              {
    7.                  mop.entityHit.attackEntityFrom(damage, l);
    8.              }
    
    

    Si c'est une entité vivante, tu l'attaque, et si c'est pas une entité vivante, tu l'attaques quand meme ?


  • Correcteurs

    Non mais c'est que je détecte par la suite différentes entités touchées pour appliquer des dégâts différents. J'ai juste pas tout enlevé pour présenter la classe sur le forum ^^



  • juste enlève le else,

    
    **if** (mop.entityHit **instanceof** EntityLivingBase)
              mop.entityHit.attackEntityFrom(damage, l);
    
    

  • Correcteurs

    En gros ça donne ça

    if(mop.entityHit != null)
            {
                float l = strength;
                if (mop.entityHit instanceof MonMob || mop.entityHit instanceof MonMob2)
                {
                    mop.entityHit.attackEntityFrom(plasma, l + 5);
                }
                else
                {
                    mop.entityHit.attackEntityFrom(plasma, l);
                }
                setDead();
            }
            else
            {
                setDead();
            }
    

    Mob différent, dégâts différents.



  • En fait c'est comme si t'écrivais ça 🙂

    %(#000000)[[size=small]mop]%(#666600)[[size=small].]%(#000000)[[size=small]entityHit]%(#666600)[[size=small].]%(#000000)[[size=small]attackEntityFrom]%(#666600)[[size=small](]%(#000000)[[size=small]plasma]%(#666600)[[size=small],] %(#000000)[[size=small]mop]%(#666600)[[size=small].]%(#000000)[[size=small]entityHit ]%(#7f0055)[[size=small]**instanceof**] %(#000000)[[size=small]MonMob] %(#666600)[[size=small]||]%(#000000)[[size=small] mop]%(#666600)[[size=small].]%(#000000)[[size=small]entityHit ]%(#7f0055)[[size=small]**instanceof**] %(#000000)[[size=small]MonMob2 ? l + 5 : l]%(#666600)[[size=small]);]
    

  • Correcteurs

    Je note.

    Même si je ne cherche pas à poster dans la section "Vos meilleurs optimisations", ça reste agréable.