Problème arc custom



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



  • 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



  • 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…



  • 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



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



  • 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



  • 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 😕



  • 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



  • Essaie d'implémenter l'interface IEntityAdditionalSpawnData pour mieux synchroniser



  • 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 !