MFF

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

    Problème arc custom

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    10 Messages 4 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.
    • ThoquentT Hors-ligne
      Thoquent
      dernière édition par

      Salut,

      J’ai créer un arc custom avec une flèche custom. J’ai recopié les codes de l’arc de base et de la flèche de base. Tout marchait bien, sauf que j’avais un problème avec ma flèche, elle ne se positionnait pas correctement, au bout de 2 secondes par exemple, elle se déplaçait de 3 blocs. J’ai résolu ce problème mais maintenant, quand je suis en survival, ma flèche me tape directement. La classe de l’arc est la classe de base, voici celle de la flèche:

      
      import java.util.List;
      
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.enchantment.EnchantmentHelper;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.EntityLivingBase;
      import net.minecraft.entity.IProjectile;
      import net.minecraft.entity.monster.EntityEnderman;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.entity.player.EntityPlayerMP;
      import net.minecraft.entity.projectile.EntityArrow;
      import net.minecraft.network.play.server.S2BPacketChangeGameState;
      import net.minecraft.util.AxisAlignedBB;
      import net.minecraft.util.DamageSource;
      import net.minecraft.util.MathHelper;
      import net.minecraft.util.MovingObjectPosition;
      import net.minecraft.util.Vec3;
      import net.minecraft.world.World;
      
      public class EntitySolidArrow extends EntityArrow implements IProjectile
      {
         private int field_145791_d = -1;
         private int field_145792_e = -1;
         private int field_145789_f = -1;
         private Block field_145790_g;
         private int inData;
         private boolean inGround;
         /** 1 if the player can pick up the arrow */
         public int canBePickedUp;
         /** Seems to be some sort of timer for animating an arrow. */
         public int arrowShake;
         /** The owner of this arrow. */
         public Entity shootingEntity;
         private int ticksInGround;
         private int ticksInAir;
         private double damage = 2.0D;
         /** The amount of knockback an arrow applies when it hits a mob. */
         private int knockbackStrength;
         private static final String __OBFID = "CL_00001715";
      
         public EntitySolidArrow(World p_i1753_1_)
         {
             super(p_i1753_1_);
             this.renderDistanceWeight = 10.0D;
             this.setSize(0.5F, 0.5F);
         }
      
         public EntitySolidArrow(World p_i1754_1_, double p_i1754_2_, double p_i1754_4_, double p_i1754_6_)
         {
             super(p_i1754_1_);
             this.renderDistanceWeight = 10.0D;
             this.setSize(0.5F, 0.5F);
             this.setPosition(p_i1754_2_, p_i1754_4_, p_i1754_6_);
             this.yOffset = 0.0F;
         }
      
         public EntitySolidArrow(World p_i1755_1_, EntityLivingBase p_i1755_2_, EntityLivingBase p_i1755_3_, float p_i1755_4_, float p_i1755_5_)
         {
             super(p_i1755_1_);
             this.renderDistanceWeight = 10.0D;
             this.shootingEntity = p_i1755_2_;
      
             if (p_i1755_2_ instanceof EntityPlayer)
             {
                 this.canBePickedUp = 1;
             }
      
             this.posY = p_i1755_2_.posY + (double)p_i1755_2_.getEyeHeight() - 0.10000000149011612D;
             double d0 = p_i1755_3_.posX - p_i1755_2_.posX;
             double d1 = p_i1755_3_.boundingBox.minY + (double)(p_i1755_3_.height / 3.0F) - this.posY;
             double d2 = p_i1755_3_.posZ - p_i1755_2_.posZ;
             double d3 = (double)MathHelper.sqrt_double(d0 * d0 + d2 * d2);
      
             if (d3 >= 1.0E-7D)
             {
                 float f2 = (float)(Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F;
                 float f3 = (float)(-(Math.atan2(d1, d3) * 180.0D / Math.PI));
                 double d4 = d0 / d3;
                 double d5 = d2 / d3;
                 this.setLocationAndAngles(p_i1755_2_.posX + d4, this.posY, p_i1755_2_.posZ + d5, f2, f3);
                 this.yOffset = 0.0F;
                 float f4 = (float)d3 * 0.2F;
                 this.setThrowableHeading(d0, d1 + (double)f4, d2, p_i1755_4_, p_i1755_5_);
             }
         }
      
         public EntitySolidArrow(World p_i1756_1_, EntityLivingBase p_i1756_2_, float p_i1756_3_)
         {
             super(p_i1756_1_);
             this.renderDistanceWeight = 10.0D;
             this.shootingEntity = p_i1756_2_;
      
             if (p_i1756_2_ instanceof EntityPlayer)
             {
                 this.canBePickedUp = 1;
             }
      
             this.setSize(0.5F, 0.5F);
             this.setLocationAndAngles(p_i1756_2_.posX, p_i1756_2_.posY + (double)p_i1756_2_.getEyeHeight(), p_i1756_2_.posZ, p_i1756_2_.rotationYaw, p_i1756_2_.rotationPitch);
             this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
             this.posY -= 0.10000000149011612D;
             this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
             this.setPosition(this.posX, this.posY, this.posZ);
             this.yOffset = 0.0F;
             this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
             this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
             this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI));
             this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F);
         }
      
         @Override
         public void onUpdate()
         {
      
             if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
             {
                 float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
                 this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
                 this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI);
             }
      
             Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f);
      
             if (block.getMaterial() != Material.air)
             {
                 block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f);
                 AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f);
      
                 if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ)))
                 {
                     this.inGround = true;
                 }
             }
      
             if (this.arrowShake > 0)
             {
                 –this.arrowShake;
             }
      
             if (this.inGround)
             {
                 int j = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f);
      
                 if (block == this.field_145790_g && j == this.inData)
                 {
                     ++this.ticksInGround;
      
                     if (this.ticksInGround == 1200)
                     {
                         this.setDead();
                     }
                 }
                 else
                 {
                     this.inGround = false;
                     this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
                     this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
                     this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
                     this.ticksInGround = 0;
                     this.ticksInAir = 0;
                 }
             }
             else
             {
                 ++this.ticksInAir;
                 Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
                 Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
                 MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false);
                 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
                 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
      
                 if (movingobjectposition != null)
                 {
                     vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord);
                 }
      
                 Entity entity = null;
                 List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
                 double d0 = 0.0D;
                 int i;
                 float f1;
      
                 for (i = 0; i < list.size(); ++i)
                 {
                     Entity entity1 = (Entity)list.get(i);
      
                     if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5))
                     {
                         f1 = 0.3F;
                         AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand((double)f1, (double)f1, (double)f1);
                         MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3);
      
                         if (movingobjectposition1 != null)
                         {
                             double d1 = vec31.distanceTo(movingobjectposition1.hitVec);
      
                             if (d1 < d0 || d0 == 0.0D)
                             {
                                 entity = entity1;
                                 d0 = d1;
                             }
                         }
                     }
                 }
      
                 if (entity != null)
                 {
                     movingobjectposition = new MovingObjectPosition(entity);
                 }
      
                 if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer)
                 {
                     EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit;
      
                     if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer))
                     {
                         movingobjectposition = null;
                     }
                 }
      
                 float f2;
                 float f4;
      
                 if (movingobjectposition != null)
                 {
                     if (movingobjectposition.entityHit != null)
                     {
                         f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
                         int k = MathHelper.ceiling_double_int((double)f2 * this.damage);
      
                         if (this.getIsCritical())
                         {
                             k += this.rand.nextInt(k / 2 + 2);
                         }
      
                         DamageSource damagesource = null;
      
                         if (this.shootingEntity == null)
                         {
                             damagesource = DamageSource.causeArrowDamage(this, this);
                         }
                         else
                         {
                             damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity);
                         }
      
                         if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman))
                         {
                             movingobjectposition.entityHit.setFire(5);
                         }
      
                         if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k))
                         {
                             if (movingobjectposition.entityHit instanceof EntityLivingBase)
                             {
                                 EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit;
      
                                 if (!this.worldObj.isRemote)
                                 {
                                     entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1);
                                 }
      
                                 if (this.knockbackStrength > 0)
                                 {
                                     f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
      
                                     if (f4 > 0.0F)
                                     {
                                         movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4);
                                     }
                                 }
      
                                 if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase)
                                 {
                                     EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity);
                                     EnchantmentHelper.func_151385_b((EntityLivingBase)this.shootingEntity, entitylivingbase);
                                 }
      
                                 if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP)
                                 {
                                     ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F));
                                 }
                             }
      
                             this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
      
                             if (!(movingobjectposition.entityHit instanceof EntityEnderman))
                             {
                                 this.setDead();
                             }
                         }
                         else
                         {
                             this.motionX *= -0.10000000149011612D;
                             this.motionY *= -0.10000000149011612D;
                             this.motionZ *= -0.10000000149011612D;
                             this.rotationYaw += 180.0F;
                             this.prevRotationYaw += 180.0F;
                             this.ticksInAir = 0;
                         }
                     }
                     else
                     {
                         this.field_145791_d = movingobjectposition.blockX;
                         this.field_145792_e = movingobjectposition.blockY;
                         this.field_145789_f = movingobjectposition.blockZ;
                         this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f);
                         this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f);
                         this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX));
                         this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY));
                         this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ));
                         f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
                         this.posX -= this.motionX / (double)f2 * 0.05000000074505806D;
                         this.posY -= this.motionY / (double)f2 * 0.05000000074505806D;
                         this.posZ -= this.motionZ / (double)f2 * 0.05000000074505806D;
                         this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
                         this.inGround = true;
                         this.arrowShake = 7;
                         this.setIsCritical(false);
      
                         if (this.field_145790_g.getMaterial() != Material.air)
                         {
                             this.field_145790_g.onEntityCollidedWithBlock(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f, this);
                         }
                     }
                 }
      
                 if (this.getIsCritical())
                 {
                     for (i = 0; i < 4; ++i)
                     {
                         this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ);
                     }
                 }
      
                 this.posX += this.motionX;
                 this.posY += this.motionY;
                 this.posZ += this.motionZ;
                 f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
                 this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
      
                 for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F)
                 {
                     ;
                 }
      
                 while (this.rotationPitch - this.prevRotationPitch >= 180.0F)
                 {
                     this.prevRotationPitch += 360.0F;
                 }
      
                 while (this.rotationYaw - this.prevRotationYaw < -180.0F)
                 {
                     this.prevRotationYaw -= 360.0F;
                 }
      
                 while (this.rotationYaw - this.prevRotationYaw >= 180.0F)
                 {
                     this.prevRotationYaw += 360.0F;
                 }
      
                 this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
                 this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
                 float f3 = 0.99F;
                 f1 = 0.05F;
      
                 if (this.isInWater())
                 {
                     for (int l = 0; l < 4; ++l)
                     {
                         f4 = 0.25F;
                         this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ);
                     }
      
                     f3 = 0.8F;
                 }
      
                 if (this.isWet())
                 {
                     this.extinguish();
                 }
      
                 this.motionX *= (double)f3;
                 this.motionY *= (double)f3;
                 this.motionZ *= (double)f3;
                 this.motionY -= (double)f1;
                 this.setPosition(this.posX, this.posY, this.posZ);
                 this.func_145775_I();
             }
         }
      
      }
      
      

      Les quelques fois ou la flèche ne frappe pas le shooter, le rendu est mauvais et elle pointe dans des directions random.

      1 réponse Dernière réponse Répondre Citer 0
      • SCAREXS Hors-ligne
        SCAREX
        dernière édition par

        Personnellement je te conseille de faire un copier-coller de la classe de la flèche plutôt de mettre ta classe extends EntityArrow car le code de Minecraft est toujours fait n’importe comment

        PS : pense à l’utilisation des balises java au lieu des balises code pour la coloration syntaxique

        Site web contenant mes scripts : http://SCAREXgaming.github.io

        Pas de demandes de support par MP ni par skype SVP.
        Je n'accepte sur skype que l…

        1 réponse Dernière réponse Répondre Citer 0
        • ThoquentT Hors-ligne
          Thoquent
          dernière édition par

          Ha oui j’avais oublié ^^

          Si je copie colle EntityArrow ça marche partiellement. Les flèches se positionnent mal, si je tire sur un mur, elle reste 2 blocs plus loin. Le seul problème que j’ai c’est vraiment pour les dégâts que je subis…

          1 réponse Dernière réponse Répondre Citer 0
          • SCAREXS Hors-ligne
            SCAREX
            dernière édition par

            C’est bizarre parce que normalement avec un pure copier-coller ça devrait avoir le même fonctionnement, sinon c’est que tu as modifié quelque chose

            Site web contenant mes scripts : http://SCAREXgaming.github.io

            Pas de demandes de support par MP ni par skype SVP.
            Je n'accepte sur skype que l…

            1 réponse Dernière réponse Répondre Citer 0
            • ThoquentT Hors-ligne
              Thoquent
              dernière édition par

              Je suis pas fou ^^ la fréquence d’update était sur 20 quand j’ai register l’entité, la classe était exactement la même excepté le nom mais ça ne marchait pas bien…

              1 réponse Dernière réponse Répondre Citer 0
              • AymericRedA Hors-ligne
                AymericRed
                dernière édition par

                Perso, moi j’ai fait un arc custom qui lance les flèches de Minecraft et j’ai aussi des problèmes de position, la flèche part de travers sur le client puis est repositionné 1ou2 secondes après.

                Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

                Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                1 réponse Dernière réponse Répondre Citer 0
                • leo01418L Hors-ligne
                  leo01418
                  dernière édition par

                  pareil que toi j’ai fait un arc (copié-collé de la casse principale) et avec une fleche custom(pareil copié collé de la classe principale ) et sa fait ce problème 😕

                  Voila ma signature

                  1 réponse Dernière réponse Répondre Citer 0
                  • ThoquentT Hors-ligne
                    Thoquent
                    dernière édition par

                    Je suis allez regarder les sources du Balkon’s weapon mod.
                    J’ai regarder la classe EntityProjectile et la classe EntityCrossbowBolt et tout marche niquel.

                    https://github.com/Ckathode/balkons-weaponmod/tree/master/src/main/java/ckathode/weaponmod/entity/projectile

                    1 réponse Dernière réponse Répondre Citer 0
                    • SCAREXS Hors-ligne
                      SCAREX
                      dernière édition par

                      Essaie d’implémenter l’interface IEntityAdditionalSpawnData pour mieux synchroniser

                      Site web contenant mes scripts : http://SCAREXgaming.github.io

                      Pas de demandes de support par MP ni par skype SVP.
                      Je n'accepte sur skype que l…

                      1 réponse Dernière réponse Répondre Citer 0
                      • ThoquentT Hors-ligne
                        Thoquent
                        dernière édition par

                        Je n’essaye pas parce que j’ai déjà mis beaucoup de temps pour le faire et vu que ça marche comme ça je ne change plus. Maintenant je dois juste faire une hitbox plus réaliste, en longueur. Je suis en train de chercher, je tiens au courant pour les intéressés !

                        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