MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Source des dégâts/EntityThrowable

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    13 Messages 3 Publieurs 1.6k Vues 1 Watching
    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.
    • FolganskyF Hors-ligne
      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
      • robin4002R Hors-ligne
        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
        • FolganskyF Hors-ligne
          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
          • DylemD Hors-ligne
            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
            • FolganskyF Hors-ligne
              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
              • robin4002R Hors-ligne
                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
                • FolganskyF Hors-ligne
                  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
                  • DylemD Hors-ligne
                    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
                    • FolganskyF Hors-ligne
                      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
                      • DylemD Hors-ligne
                        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
                        • FolganskyF Hors-ligne
                          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
                          • DylemD Hors-ligne
                            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
                            • FolganskyF Hors-ligne
                              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
                              ContactMentions Légales

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB