• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Problème arc custom

    1.7.x
    1.7.10
    4
    10
    1319
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Thoquent
      Thoquent last edited by

      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 Reply Last reply Reply Quote 0
      • SCAREX
        SCAREX last edited by

        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 Reply Last reply Reply Quote 0
        • Thoquent
          Thoquent last edited by

          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 Reply Last reply Reply Quote 0
          • SCAREX
            SCAREX last edited by

            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 Reply Last reply Reply Quote 0
            • Thoquent
              Thoquent last edited by

              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 Reply Last reply Reply Quote 0
              • AymericRed
                AymericRed last edited by

                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 Reply Last reply Reply Quote 0
                • leo01418
                  leo01418 last edited by

                  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 Reply Last reply Reply Quote 0
                  • Thoquent
                    Thoquent last edited by

                    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 Reply Last reply Reply Quote 0
                    • SCAREX
                      SCAREX last edited by

                      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 Reply Last reply Reply Quote 0
                      • Thoquent
                        Thoquent last edited by

                        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 Reply Last reply Reply Quote 0
                        • 1 / 1
                        • First post
                          Last post
                        Design by Woryk
                        Contact / Mentions Légales

                        MINECRAFT FORGE FRANCE © 2018

                        Powered by NodeBB