Exemple #1
0
  public void l_() {
    super.l_();
    if (this.e() > 0) {
      this.a(this.e() - 1);
    }

    if (this.getDamage() > 0.0F) {
      this.setDamage(this.getDamage() - 1.0F);
    }

    this.lastX = this.locX;
    this.lastY = this.locY;
    this.lastZ = this.locZ;
    byte b0 = 5;
    double d0 = 0.0D;

    for (int i = 0; i < b0; ++i) {
      double d1 =
          this.boundingBox.b
              + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 0) / (double) b0
              - 0.125D;
      double d2 =
          this.boundingBox.b
              + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 1) / (double) b0
              - 0.125D;
      AxisAlignedBB axisalignedbb =
          AxisAlignedBB.a()
              .a(
                  this.boundingBox.a,
                  d1,
                  this.boundingBox.c,
                  this.boundingBox.d,
                  d2,
                  this.boundingBox.f);

      if (this.world.b(axisalignedbb, Material.WATER)) {
        d0 += 1.0D / (double) b0;
      }
    }

    double d3 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ);
    double d4;
    double d5;

    if (d3 > 0.26249999999999996D) {
      d4 = Math.cos((double) this.yaw * 3.141592653589793D / 180.0D);
      d5 = Math.sin((double) this.yaw * 3.141592653589793D / 180.0D);

      for (int j = 0; (double) j < 1.0D + d3 * 60.0D; ++j) {
        double d6 = (double) (this.random.nextFloat() * 2.0F - 1.0F);
        double d7 = (double) (this.random.nextInt(2) * 2 - 1) * 0.7D;
        double d8;
        double d9;

        if (this.random.nextBoolean()) {
          d8 = this.locX - d4 * d6 * 0.8D + d5 * d7;
          d9 = this.locZ - d5 * d6 * 0.8D - d4 * d7;
          this.world.addParticle(
              "splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ);
        } else {
          d8 = this.locX + d4 + d5 * d6 * 0.7D;
          d9 = this.locZ + d5 - d4 * d6 * 0.7D;
          this.world.addParticle(
              "splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ);
        }
      }
    }

    double d10;
    double d11;

    if (this.world.isStatic && this.a) {
      if (this.c > 0) {
        d4 = this.locX + (this.d - this.locX) / (double) this.c;
        d5 = this.locY + (this.e - this.locY) / (double) this.c;
        d10 = this.locZ + (this.f - this.locZ) / (double) this.c;
        d11 = MathHelper.g(this.g - (double) this.yaw);
        this.yaw = (float) ((double) this.yaw + d11 / (double) this.c);
        this.pitch =
            (float) ((double) this.pitch + (this.h - (double) this.pitch) / (double) this.c);
        --this.c;
        this.setPosition(d4, d5, d10);
        this.b(this.yaw, this.pitch);
      } else {
        d4 = this.locX + this.motX;
        d5 = this.locY + this.motY;
        d10 = this.locZ + this.motZ;
        this.setPosition(d4, d5, d10);
        if (this.onGround) {
          this.motX *= 0.5D;
          this.motY *= 0.5D;
          this.motZ *= 0.5D;
        }

        this.motX *= 0.9900000095367432D;
        this.motY *= 0.949999988079071D;
        this.motZ *= 0.9900000095367432D;
      }
    } else {
      if (d0 < 1.0D) {
        d4 = d0 * 2.0D - 1.0D;
        this.motY += 0.03999999910593033D * d4;
      } else {
        if (this.motY < 0.0D) {
          this.motY /= 2.0D;
        }

        this.motY += 0.007000000216066837D;
      }

      if (this.passenger != null && this.passenger instanceof EntityLiving) {
        d4 = (double) ((EntityLiving) this.passenger).bf;
        if (d4 > 0.0D) {
          d5 = -Math.sin((double) (this.passenger.yaw * 3.1415927F / 180.0F));
          d10 = Math.cos((double) (this.passenger.yaw * 3.1415927F / 180.0F));
          this.motX += d5 * this.b * 0.05000000074505806D;
          this.motZ += d10 * this.b * 0.05000000074505806D;
        }
      }

      d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ);
      if (d4 > 0.35D) {
        d5 = 0.35D / d4;
        this.motX *= d5;
        this.motZ *= d5;
        d4 = 0.35D;
      }

      if (d4 > d3 && this.b < 0.35D) {
        this.b += (0.35D - this.b) / 35.0D;
        if (this.b > 0.35D) {
          this.b = 0.35D;
        }
      } else {
        this.b -= (this.b - 0.07D) / 35.0D;
        if (this.b < 0.07D) {
          this.b = 0.07D;
        }
      }

      if (this.onGround) {
        this.motX *= 0.5D;
        this.motY *= 0.5D;
        this.motZ *= 0.5D;
      }

      this.move(this.motX, this.motY, this.motZ);
      if (this.positionChanged && d3 > 0.2D) {
        if (!this.world.isStatic && !this.dead) {
          this.die();

          int k;

          for (k = 0; k < 3; ++k) {
            this.a(Block.WOOD.id, 1, 0.0F);
          }

          for (k = 0; k < 2; ++k) {
            this.a(Item.STICK.id, 1, 0.0F);
          }
        }
      } else {
        this.motX *= 0.9900000095367432D;
        this.motY *= 0.949999988079071D;
        this.motZ *= 0.9900000095367432D;
      }

      this.pitch = 0.0F;
      d5 = (double) this.yaw;
      d10 = this.lastX - this.locX;
      d11 = this.lastZ - this.locZ;
      if (d10 * d10 + d11 * d11 > 0.001D) {
        d5 = (double) ((float) (Math.atan2(d11, d10) * 180.0D / 3.141592653589793D));
      }

      double d12 = MathHelper.g(d5 - (double) this.yaw);

      if (d12 > 20.0D) {
        d12 = 20.0D;
      }

      if (d12 < -20.0D) {
        d12 = -20.0D;
      }

      this.yaw = (float) ((double) this.yaw + d12);
      this.b(this.yaw, this.pitch);
      if (!this.world.isStatic) {
        List list =
            this.world.getEntities(
                this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D));
        int l;

        if (list != null && !list.isEmpty()) {
          for (l = 0; l < list.size(); ++l) {
            Entity entity = (Entity) list.get(l);

            if (entity != this.passenger && entity.L() && entity instanceof EntityBoat) {
              entity.collide(this);
            }
          }
        }

        for (l = 0; l < 4; ++l) {
          int i1 = MathHelper.floor(this.locX + ((double) (l % 2) - 0.5D) * 0.8D);
          int j1 = MathHelper.floor(this.locZ + ((double) (l / 2) - 0.5D) * 0.8D);

          for (int k1 = 0; k1 < 2; ++k1) {
            int l1 = MathHelper.floor(this.locY) + k1;
            int i2 = this.world.getTypeId(i1, l1, j1);

            if (i2 == Block.SNOW.id) {
              this.world.setAir(i1, l1, j1);
            } else if (i2 == Block.WATER_LILY.id) {
              this.world.setAir(i1, l1, j1, true);
            }
          }
        }

        if (this.passenger != null && this.passenger.dead) {
          this.passenger = null;
        }
      }
    }
  }
  public void j_() {
    super.j_();
    if (this.lastPitch == 0.0F && this.lastYaw == 0.0F) {
      float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ);

      this.lastYaw =
          this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D);
      this.lastPitch =
          this.pitch = (float) (Math.atan2(this.motY, (double) f) * 180.0D / 3.1415927410125732D);
    }

    int i = this.world.getTypeId(this.d, this.e, this.f);

    if (i > 0) {
      Block.byId[i].updateShape(this.world, this.d, this.e, this.f);
      AxisAlignedBB axisalignedbb = Block.byId[i].e(this.world, this.d, this.e, this.f);

      if (axisalignedbb != null
          && axisalignedbb.a(this.world.getVec3DPool().create(this.locX, this.locY, this.locZ))) {
        this.inGround = true;
      }
    }

    if (this.shake > 0) {
      --this.shake;
    }

    if (this.inGround) {
      int j = this.world.getTypeId(this.d, this.e, this.f);
      int k = this.world.getData(this.d, this.e, this.f);

      if (j == this.g && k == this.h) {
        ++this.j;
        if (this.j == 1200) {
          this.die();
        }
      } else {
        this.inGround = false;
        this.motX *= (double) (this.random.nextFloat() * 0.2F);
        this.motY *= (double) (this.random.nextFloat() * 0.2F);
        this.motZ *= (double) (this.random.nextFloat() * 0.2F);
        this.j = 0;
        this.at = 0;
      }
    } else {
      ++this.at;
      Vec3D vec3d = this.world.getVec3DPool().create(this.locX, this.locY, this.locZ);
      Vec3D vec3d1 =
          this.world
              .getVec3DPool()
              .create(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ);
      MovingObjectPosition movingobjectposition = this.world.rayTrace(vec3d, vec3d1, false, true);

      vec3d = this.world.getVec3DPool().create(this.locX, this.locY, this.locZ);
      vec3d1 =
          this.world
              .getVec3DPool()
              .create(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ);
      if (movingobjectposition != null) {
        vec3d1 =
            this.world
                .getVec3DPool()
                .create(
                    movingobjectposition.pos.c,
                    movingobjectposition.pos.d,
                    movingobjectposition.pos.e);
      }

      Entity entity = null;
      List list =
          this.world.getEntities(
              this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D));
      double d0 = 0.0D;

      int l;
      float f1;

      for (l = 0; l < list.size(); ++l) {
        Entity entity1 = (Entity) list.get(l);

        if (entity1.L() && (entity1 != this.shooter || this.at >= 5)) {
          f1 = 0.3F;
          AxisAlignedBB axisalignedbb1 =
              entity1.boundingBox.grow((double) f1, (double) f1, (double) f1);
          MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1);

          if (movingobjectposition1 != null) {
            double d1 =
                vec3d.distanceSquared(
                    movingobjectposition1.pos); // CraftBukkit - distance efficiency

            if (d1 < d0 || d0 == 0.0D) {
              entity = entity1;
              d0 = d1;
            }
          }
        }
      }

      if (entity != null) {
        movingobjectposition = new MovingObjectPosition(entity);
      }

      float f2;
      float f3;

      if (movingobjectposition != null) {
        // CraftBukkit start
        Projectile projectile = (Projectile) this.getBukkitEntity();
        ProjectileHitEvent phe = new ProjectileHitEvent(projectile);
        this.world.getServer().getPluginManager().callEvent(phe);
        // CraftBukkit end
        if (movingobjectposition.entity != null) {
          f2 =
              MathHelper.sqrt(
                  this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ);
          int i1 = MathHelper.f((double) f2 * this.damage);

          if (this.d()) {
            i1 += this.random.nextInt(i1 / 2 + 2);
          }

          DamageSource damagesource = null;

          if (this.shooter == null) {
            damagesource = DamageSource.arrow(this, this);
          } else {
            damagesource = DamageSource.arrow(this, this.shooter);
          }

          // CraftBukkit start - moved damage call
          if (movingobjectposition.entity.damageEntity(damagesource, i1)) {
            if (this.isBurning()
                && !(movingobjectposition.entity instanceof EntityEnderman)
                && (!(movingobjectposition.entity instanceof EntityPlayer)
                    || !(this.shooter instanceof EntityPlayer)
                    || this.world
                        .pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a
                                     // player.
              EntityCombustByEntityEvent combustEvent =
                  new EntityCombustByEntityEvent(
                      this.getBukkitEntity(), entity.getBukkitEntity(), 5);
              org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent);

              if (!combustEvent.isCancelled()) {
                movingobjectposition.entity.setOnFire(combustEvent.getDuration());
              }
              // CraftBukkit end
            }

            // if (movingobjectposition.entity.damageEntity(damagesource, i1)) { // CraftBukkit -
            // moved up
            if (movingobjectposition.entity instanceof EntityLiving) {
              EntityLiving entityliving = (EntityLiving) movingobjectposition.entity;

              if (!this.world.isStatic) {
                entityliving.r(entityliving.bJ() + 1);
              }

              if (this.av > 0) {
                f3 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ);

                if (f3 > 0.0F) {
                  movingobjectposition.entity.g(
                      this.motX * (double) this.av * 0.6000000238418579D / (double) f3,
                      0.1D,
                      this.motZ * (double) this.av * 0.6000000238418579D / (double) f3);
                }
              }

              if (this.shooter != null) {
                EnchantmentThorns.a(this.shooter, entityliving, this.random);
              }

              if (this.shooter != null
                  && movingobjectposition.entity != this.shooter
                  && movingobjectposition.entity instanceof EntityHuman
                  && this.shooter instanceof EntityPlayer) {
                ((EntityPlayer) this.shooter).playerConnection.sendPacket(new Packet70Bed(6, 0));
              }
            }

            this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F));
            if (!(movingobjectposition.entity instanceof EntityEnderman)) {
              this.die();
            }
          } else {
            this.motX *= -0.10000000149011612D;
            this.motY *= -0.10000000149011612D;
            this.motZ *= -0.10000000149011612D;
            this.yaw += 180.0F;
            this.lastYaw += 180.0F;
            this.at = 0;
          }
        } else {
          this.d = movingobjectposition.b;
          this.e = movingobjectposition.c;
          this.f = movingobjectposition.d;
          this.g = this.world.getTypeId(this.d, this.e, this.f);
          this.h = this.world.getData(this.d, this.e, this.f);
          this.motX = (double) ((float) (movingobjectposition.pos.c - this.locX));
          this.motY = (double) ((float) (movingobjectposition.pos.d - this.locY));
          this.motZ = (double) ((float) (movingobjectposition.pos.e - this.locZ));
          f2 =
              MathHelper.sqrt(
                  this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ);
          this.locX -= this.motX / (double) f2 * 0.05000000074505806D;
          this.locY -= this.motY / (double) f2 * 0.05000000074505806D;
          this.locZ -= this.motZ / (double) f2 * 0.05000000074505806D;
          this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F));
          this.inGround = true;
          this.shake = 7;
          this.e(false);
          if (this.g != 0) {
            Block.byId[this.g].a(this.world, this.d, this.e, this.f, this);
          }
        }
      }

      if (this.d()) {
        for (l = 0; l < 4; ++l) {
          this.world.addParticle(
              "crit",
              this.locX + this.motX * (double) l / 4.0D,
              this.locY + this.motY * (double) l / 4.0D,
              this.locZ + this.motZ * (double) l / 4.0D,
              -this.motX,
              -this.motY + 0.2D,
              -this.motZ);
        }
      }

      this.locX += this.motX;
      this.locY += this.motY;
      this.locZ += this.motZ;
      f2 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ);
      this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D);

      for (this.pitch = (float) (Math.atan2(this.motY, (double) f2) * 180.0D / 3.1415927410125732D);
          this.pitch - this.lastPitch < -180.0F;
          this.lastPitch -= 360.0F) {;
      }

      while (this.pitch - this.lastPitch >= 180.0F) {
        this.lastPitch += 360.0F;
      }

      while (this.yaw - this.lastYaw < -180.0F) {
        this.lastYaw -= 360.0F;
      }

      while (this.yaw - this.lastYaw >= 180.0F) {
        this.lastYaw += 360.0F;
      }

      this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F;
      this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F;
      float f4 = 0.99F;

      f1 = 0.05F;
      if (this.H()) {
        for (int j1 = 0; j1 < 4; ++j1) {
          f3 = 0.25F;
          this.world.addParticle(
              "bubble",
              this.locX - this.motX * (double) f3,
              this.locY - this.motY * (double) f3,
              this.locZ - this.motZ * (double) f3,
              this.motX,
              this.motY,
              this.motZ);
        }

        f4 = 0.8F;
      }

      this.motX *= (double) f4;
      this.motY *= (double) f4;
      this.motZ *= (double) f4;
      this.motY -= (double) f1;
      this.setPosition(this.locX, this.locY, this.locZ);
      this.D();
    }
  }