• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Source des dégâts/EntityThrowable

    1.7.x
    1.7.10
    3
    13
    1490
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Folgansky
      Folgansky Correcteurs dernière édition par

      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();
              }
          }
      
      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        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.

        1 réponse Dernière réponse Répondre Citer 0
        • Folgansky
          Folgansky Correcteurs dernière édition par

          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;
              }
          }
          
          1 réponse Dernière réponse Répondre Citer 0
          • Dylem
            Dylem dernière édition par

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

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

            Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

            1 réponse Dernière réponse Répondre Citer 0
            • Folgansky
              Folgansky Correcteurs dernière édition par

              ç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.

              1 réponse Dernière réponse Répondre Citer 0
              • robin4002
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                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.

                1 réponse Dernière réponse Répondre Citer 0
                • Folgansky
                  Folgansky Correcteurs dernière édition par

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

                  1 réponse Dernière réponse Répondre Citer 0
                  • Dylem
                    Dylem dernière édition par

                    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 ?

                    Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

                    1 réponse Dernière réponse Répondre Citer 0
                    • Folgansky
                      Folgansky Correcteurs dernière édition par

                      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 ^^

                      1 réponse Dernière réponse Répondre Citer 0
                      • Dylem
                        Dylem dernière édition par

                        juste enlève le else,

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

                        Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

                        1 réponse Dernière réponse Répondre Citer 0
                        • Folgansky
                          Folgansky Correcteurs dernière édition par

                          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.

                          1 réponse Dernière réponse Répondre Citer 0
                          • Dylem
                            Dylem dernière édition par

                            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]);]
                            

                            Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

                            1 réponse Dernière réponse Répondre Citer 0
                            • Folgansky
                              Folgansky Correcteurs dernière édition par

                              Je note.

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

                              1 réponse Dernière réponse Répondre Citer 0
                              • 1 / 1
                              • Premier message
                                Dernier message
                              Design by Woryk
                              Contact / Mentions Légales

                              MINECRAFT FORGE FRANCE © 2018

                              Powered by NodeBB