Beispiel #1
0
 /** Adds the crafting recipes to the CraftingManager. */
 public void addRecipes(CraftingManager p_77589_1_) {
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.chest), new Object[] {"###", "# #", "###", '#', Blocks.planks});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.trapped_chest),
       new Object[] {"#-", '#', Blocks.chest, '-', Blocks.tripwire_hook});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.ender_chest),
       new Object[] {"###", "#E#", "###", '#', Blocks.obsidian, 'E', Items.ender_eye});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.furnace), new Object[] {"###", "# #", "###", '#', Blocks.cobblestone});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.crafting_table), new Object[] {"##", "##", '#', Blocks.planks});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.sandstone),
       new Object[] {
         "##", "##", '#', new ItemStack(Blocks.sand, 1, BlockSand.EnumType.SAND.func_176688_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.red_sandstone),
       new Object[] {
         "##",
         "##",
         '#',
         new ItemStack(Blocks.sand, 1, BlockSand.EnumType.RED_SAND.func_176688_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.sandstone, 4, BlockSandStone.EnumType.SMOOTH.func_176675_a()),
       new Object[] {
         "##",
         "##",
         '#',
         new ItemStack(Blocks.sandstone, 1, BlockSandStone.EnumType.DEFAULT.func_176675_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(
           Blocks.red_sandstone, 4, BlockRedSandstone.EnumType.SMOOTH.getMetaFromState()),
       new Object[] {
         "##",
         "##",
         '#',
         new ItemStack(
             Blocks.red_sandstone, 1, BlockRedSandstone.EnumType.DEFAULT.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.sandstone, 1, BlockSandStone.EnumType.CHISELED.func_176675_a()),
       new Object[] {
         "#",
         "#",
         '#',
         new ItemStack(Blocks.stone_slab, 1, BlockStoneSlab.EnumType.SAND.func_176624_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(
           Blocks.red_sandstone, 1, BlockRedSandstone.EnumType.CHISELED.getMetaFromState()),
       new Object[] {
         "#",
         "#",
         '#',
         new ItemStack(
             Blocks.stone_slab2, 1, BlockStoneSlabNew.EnumType.RED_SANDSTONE.func_176915_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.quartz_block, 1, BlockQuartz.EnumType.CHISELED.getMetaFromState()),
       new Object[] {
         "#",
         "#",
         '#',
         new ItemStack(Blocks.stone_slab, 1, BlockStoneSlab.EnumType.QUARTZ.func_176624_a())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.quartz_block, 2, BlockQuartz.EnumType.LINES_Y.getMetaFromState()),
       new Object[] {
         "#",
         "#",
         '#',
         new ItemStack(Blocks.quartz_block, 1, BlockQuartz.EnumType.DEFAULT.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stonebrick, 4),
       new Object[] {
         "##",
         "##",
         '#',
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.STONE.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stonebrick, 1, BlockStoneBrick.CHISELED_META),
       new Object[] {
         "#",
         "#",
         '#',
         new ItemStack(Blocks.stone_slab, 1, BlockStoneSlab.EnumType.SMOOTHBRICK.func_176624_a())
       });
   p_77589_1_.addShapelessRecipe(
       new ItemStack(Blocks.stonebrick, 1, BlockStoneBrick.MOSSY_META),
       new Object[] {Blocks.stonebrick, Blocks.vine});
   p_77589_1_.addShapelessRecipe(
       new ItemStack(Blocks.mossy_cobblestone, 1), new Object[] {Blocks.cobblestone, Blocks.vine});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.iron_bars, 16), new Object[] {"###", "###", '#', Items.iron_ingot});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.glass_pane, 16), new Object[] {"###", "###", '#', Blocks.glass});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.redstone_lamp, 1),
       new Object[] {" R ", "RGR", " R ", 'R', Items.redstone, 'G', Blocks.glowstone});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.beacon, 1),
       new Object[] {
         "GGG", "GSG", "OOO", 'G', Blocks.glass, 'S', Items.nether_star, 'O', Blocks.obsidian
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.nether_brick, 1), new Object[] {"NN", "NN", 'N', Items.netherbrick});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stone, 2, BlockStone.EnumType.DIORITE.getMetaFromState()),
       new Object[] {"CQ", "QC", 'C', Blocks.cobblestone, 'Q', Items.quartz});
   p_77589_1_.addShapelessRecipe(
       new ItemStack(Blocks.stone, 1, BlockStone.EnumType.GRANITE.getMetaFromState()),
       new Object[] {
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.DIORITE.getMetaFromState()),
         Items.quartz
       });
   p_77589_1_.addShapelessRecipe(
       new ItemStack(Blocks.stone, 2, BlockStone.EnumType.ANDESITE.getMetaFromState()),
       new Object[] {
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.DIORITE.getMetaFromState()),
         Blocks.cobblestone
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.dirt, 4, BlockDirt.DirtType.COARSE_DIRT.getMetadata()),
       new Object[] {
         "DG",
         "GD",
         'D',
         new ItemStack(Blocks.dirt, 1, BlockDirt.DirtType.DIRT.getMetadata()),
         'G',
         Blocks.gravel
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stone, 4, BlockStone.EnumType.DIORITE_SMOOTH.getMetaFromState()),
       new Object[] {
         "SS",
         "SS",
         'S',
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.DIORITE.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stone, 4, BlockStone.EnumType.GRANITE_SMOOTH.getMetaFromState()),
       new Object[] {
         "SS",
         "SS",
         'S',
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.GRANITE.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.stone, 4, BlockStone.EnumType.ANDESITE_SMOOTH.getMetaFromState()),
       new Object[] {
         "SS",
         "SS",
         'S',
         new ItemStack(Blocks.stone, 1, BlockStone.EnumType.ANDESITE.getMetaFromState())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.prismarine, 1, BlockPrismarine.ROUGHMETA),
       new Object[] {"SS", "SS", 'S', Items.prismarine_shard});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.prismarine, 1, BlockPrismarine.BRICKSMETA),
       new Object[] {"SSS", "SSS", "SSS", 'S', Items.prismarine_shard});
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.prismarine, 1, BlockPrismarine.DARKMETA),
       new Object[] {
         "SSS",
         "SIS",
         "SSS",
         'S',
         Items.prismarine_shard,
         'I',
         new ItemStack(Items.dye, 1, EnumDyeColor.BLACK.getDyeColorDamage())
       });
   p_77589_1_.addRecipe(
       new ItemStack(Blocks.sea_lantern, 1, 0),
       new Object[] {
         "SCS", "CCC", "SCS", 'S', Items.prismarine_shard, 'C', Items.prismarine_crystals
       });
 }
public class EntityFishHook extends Entity {
  private static final List<WeightedRandomFishable> JUNK =
      Arrays.<WeightedRandomFishable>asList(
          new WeightedRandomFishable[] {
            (new WeightedRandomFishable(new ItemStack(Items.leather_boots), 10))
                .setMaxDamagePercent(0.9F),
            new WeightedRandomFishable(new ItemStack(Items.leather), 10),
            new WeightedRandomFishable(new ItemStack(Items.bone), 10),
            new WeightedRandomFishable(new ItemStack(Items.potionitem), 10),
            new WeightedRandomFishable(new ItemStack(Items.string), 5),
            (new WeightedRandomFishable(new ItemStack(Items.fishing_rod), 2))
                .setMaxDamagePercent(0.9F),
            new WeightedRandomFishable(new ItemStack(Items.bowl), 10),
            new WeightedRandomFishable(new ItemStack(Items.stick), 5),
            new WeightedRandomFishable(
                new ItemStack(Items.dye, 10, EnumDyeColor.BLACK.getDyeDamage()), 1),
            new WeightedRandomFishable(new ItemStack(Blocks.tripwire_hook), 10),
            new WeightedRandomFishable(new ItemStack(Items.rotten_flesh), 10)
          });
  private static final List<WeightedRandomFishable> TREASURE =
      Arrays.<WeightedRandomFishable>asList(
          new WeightedRandomFishable[] {
            new WeightedRandomFishable(new ItemStack(Blocks.waterlily), 1),
            new WeightedRandomFishable(new ItemStack(Items.name_tag), 1),
            new WeightedRandomFishable(new ItemStack(Items.saddle), 1),
            (new WeightedRandomFishable(new ItemStack(Items.bow), 1))
                .setMaxDamagePercent(0.25F)
                .setEnchantable(),
            (new WeightedRandomFishable(new ItemStack(Items.fishing_rod), 1))
                .setMaxDamagePercent(0.25F)
                .setEnchantable(),
            (new WeightedRandomFishable(new ItemStack(Items.book), 1)).setEnchantable()
          });
  private static final List<WeightedRandomFishable> FISH =
      Arrays.<WeightedRandomFishable>asList(
          new WeightedRandomFishable[] {
            new WeightedRandomFishable(
                new ItemStack(Items.fish, 1, ItemFishFood.FishType.COD.getMetadata()), 60),
            new WeightedRandomFishable(
                new ItemStack(Items.fish, 1, ItemFishFood.FishType.SALMON.getMetadata()), 25),
            new WeightedRandomFishable(
                new ItemStack(Items.fish, 1, ItemFishFood.FishType.CLOWNFISH.getMetadata()), 2),
            new WeightedRandomFishable(
                new ItemStack(Items.fish, 1, ItemFishFood.FishType.PUFFERFISH.getMetadata()), 13)
          });
  private int xTile = -1;
  private int yTile = -1;
  private int zTile = -1;
  private Block inTile;
  private boolean inGround;
  public int shake;
  public Player angler;
  private int ticksInGround;
  private int ticksInAir;
  private int ticksCatchable;
  private int ticksCaughtDelay;
  private int ticksCatchableDelay;
  private float fishApproachAngle;
  public Entity caughtEntity;
  private int fishPosRotationIncrements;
  private double fishX;
  private double fishY;
  private double fishZ;
  private double fishYaw;
  private double fishPitch;

  public static List<WeightedRandomFishable> func_174855_j() {
    return FISH;
  }

  public EntityFishHook(World worldIn) {
    super(worldIn);
    this.setSize(0.25F, 0.25F);
    this.ignoreFrustumCheck = true;
  }

  public EntityFishHook(World worldIn, Player fishingPlayer) {
    super(worldIn);
    this.ignoreFrustumCheck = true;
    this.angler = fishingPlayer;
    this.angler.fishEntity = this;
    this.setSize(0.25F, 0.25F);
    this.setLocationAndAngles(
        fishingPlayer.posX,
        fishingPlayer.posY + (double) fishingPlayer.getEyeHeight(),
        fishingPlayer.posZ,
        fishingPlayer.rotationYaw,
        fishingPlayer.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);
    float f = 0.4F;
    this.motionX =
        (double)
            (-MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI)
                * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI)
                * f);
    this.motionZ =
        (double)
            (MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI)
                * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI)
                * f);
    this.motionY = (double) (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI) * f);
    this.handleHookCasting(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
  }

  protected void entityInit() {}

  public void handleHookCasting(
      double p_146035_1_,
      double p_146035_3_,
      double p_146035_5_,
      float p_146035_7_,
      float p_146035_8_) {
    float f =
        MathHelper.sqrt_double(
            p_146035_1_ * p_146035_1_ + p_146035_3_ * p_146035_3_ + p_146035_5_ * p_146035_5_);
    p_146035_1_ = p_146035_1_ / (double) f;
    p_146035_3_ = p_146035_3_ / (double) f;
    p_146035_5_ = p_146035_5_ / (double) f;
    p_146035_1_ =
        p_146035_1_ + this.rand.nextGaussian() * 0.007499999832361937D * (double) p_146035_8_;
    p_146035_3_ =
        p_146035_3_ + this.rand.nextGaussian() * 0.007499999832361937D * (double) p_146035_8_;
    p_146035_5_ =
        p_146035_5_ + this.rand.nextGaussian() * 0.007499999832361937D * (double) p_146035_8_;
    p_146035_1_ = p_146035_1_ * (double) p_146035_7_;
    p_146035_3_ = p_146035_3_ * (double) p_146035_7_;
    p_146035_5_ = p_146035_5_ * (double) p_146035_7_;
    this.motionX = p_146035_1_;
    this.motionY = p_146035_3_;
    this.motionZ = p_146035_5_;
    float f1 = MathHelper.sqrt_double(p_146035_1_ * p_146035_1_ + p_146035_5_ * p_146035_5_);
    this.prevRotationYaw =
        this.rotationYaw =
            (float) (MathHelper.func_181159_b(p_146035_1_, p_146035_5_) * 180.0D / Math.PI);
    this.prevRotationPitch =
        this.rotationPitch =
            (float) (MathHelper.func_181159_b(p_146035_3_, (double) f1) * 180.0D / Math.PI);
    this.ticksInGround = 0;
  }

  /** Called to update the entity's position/logic. */
  public void onUpdate() {
    super.onUpdate();

    if (this.fishPosRotationIncrements > 0) {
      double d7 = this.posX + (this.fishX - this.posX) / (double) this.fishPosRotationIncrements;
      double d8 = this.posY + (this.fishY - this.posY) / (double) this.fishPosRotationIncrements;
      double d9 = this.posZ + (this.fishZ - this.posZ) / (double) this.fishPosRotationIncrements;
      double d1 = MathHelper.wrapAngleTo180_double(this.fishYaw - (double) this.rotationYaw);
      this.rotationYaw =
          (float) ((double) this.rotationYaw + d1 / (double) this.fishPosRotationIncrements);
      this.rotationPitch =
          (float)
              ((double) this.rotationPitch
                  + (this.fishPitch - (double) this.rotationPitch)
                      / (double) this.fishPosRotationIncrements);
      --this.fishPosRotationIncrements;
      this.setPosition(d7, d8, d9);
      this.setRotation(this.rotationYaw, this.rotationPitch);
    } else {
      if (!this.worldObj.isRemote) {
        ItemStack itemstack = this.angler.getCurrentEquippedItem();

        if (this.angler.isDead
            || !this.angler.isEntityAlive()
            || itemstack == null
            || itemstack.getItem() != Items.fishing_rod
            || this.getDistanceSqToEntity(this.angler) > 1024.0D) {
          this.setDead();
          this.angler.fishEntity = null;
          return;
        }

        if (this.caughtEntity != null) {
          if (!this.caughtEntity.isDead) {
            this.posX = this.caughtEntity.posX;
            double d17 = (double) this.caughtEntity.height;
            this.posY = this.caughtEntity.getEntityBoundingBox().minY + d17 * 0.8D;
            this.posZ = this.caughtEntity.posZ;
            return;
          }

          this.caughtEntity = null;
        }
      }

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

      if (this.inGround) {
        if (this.worldObj.getBlockState(new BlockPos(this.xTile, this.yTile, this.zTile)).getBlock()
            == this.inTile) {
          ++this.ticksInGround;

          if (this.ticksInGround == 1200) {
            this.setDead();
          }

          return;
        }

        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 = new Vec3(this.posX, this.posY, this.posZ);
      Vec3 vec3 =
          new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
      MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec31, vec3);
      vec31 = new Vec3(this.posX, this.posY, this.posZ);
      vec3 = new Vec3(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);

      if (movingobjectposition != null) {
        vec3 =
            new Vec3(
                movingobjectposition.hitVec.xCoord,
                movingobjectposition.hitVec.yCoord,
                movingobjectposition.hitVec.zCoord);
      }

      Entity entity = null;
      List<Entity> list =
          this.worldObj.getEntitiesWithinAABBExcludingEntity(
              this,
              this.getEntityBoundingBox()
                  .addCoord(this.motionX, this.motionY, this.motionZ)
                  .expand(1.0D, 1.0D, 1.0D));
      double d0 = 0.0D;

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

        if (entity1.canBeCollidedWith() && (entity1 != this.angler || this.ticksInAir >= 5)) {
          float f = 0.3F;
          AxisAlignedBB axisalignedbb =
              entity1.getEntityBoundingBox().expand((double) f, (double) f, (double) f);
          MovingObjectPosition movingobjectposition1 =
              axisalignedbb.calculateIntercept(vec31, vec3);

          if (movingobjectposition1 != null) {
            double d2 = vec31.squareDistanceTo(movingobjectposition1.hitVec);

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

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

      if (movingobjectposition != null) {
        if (movingobjectposition.entityHit != null) {
          if (movingobjectposition.entityHit.attackEntityFrom(
              DamageSource.causeThrownDamage(this, this.angler), 0.0F)) {
            this.caughtEntity = movingobjectposition.entityHit;
          }
        } else {
          this.inGround = true;
        }
      }

      if (!this.inGround) {
        this.moveEntity(this.motionX, this.motionY, this.motionZ);
        float f5 =
            MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
        this.rotationYaw =
            (float) (MathHelper.func_181159_b(this.motionX, this.motionZ) * 180.0D / Math.PI);

        for (this.rotationPitch =
                (float) (MathHelper.func_181159_b(this.motionY, (double) f5) * 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 f6 = 0.92F;

        if (this.onGround || this.isCollidedHorizontally) {
          f6 = 0.5F;
        }

        int j = 5;
        double d10 = 0.0D;

        for (int k = 0; k < j; ++k) {
          AxisAlignedBB axisalignedbb1 = this.getEntityBoundingBox();
          double d3 = axisalignedbb1.maxY - axisalignedbb1.minY;
          double d4 = axisalignedbb1.minY + d3 * (double) k / (double) j;
          double d5 = axisalignedbb1.minY + d3 * (double) (k + 1) / (double) j;
          AxisAlignedBB axisalignedbb2 =
              new AxisAlignedBB(
                  axisalignedbb1.minX,
                  d4,
                  axisalignedbb1.minZ,
                  axisalignedbb1.maxX,
                  d5,
                  axisalignedbb1.maxZ);

          if (this.worldObj.isAABBInMaterial(axisalignedbb2, Material.water)) {
            d10 += 1.0D / (double) j;
          }
        }

        if (!this.worldObj.isRemote && d10 > 0.0D) {
          WorldServer worldserver = (WorldServer) this.worldObj;
          int l = 1;
          BlockPos blockpos = (new BlockPos(this)).up();

          if (this.rand.nextFloat() < 0.25F && this.worldObj.canLightningStrike(blockpos)) {
            l = 2;
          }

          if (this.rand.nextFloat() < 0.5F && !this.worldObj.canSeeSky(blockpos)) {
            --l;
          }

          if (this.ticksCatchable > 0) {
            --this.ticksCatchable;

            if (this.ticksCatchable <= 0) {
              this.ticksCaughtDelay = 0;
              this.ticksCatchableDelay = 0;
            }
          } else if (this.ticksCatchableDelay > 0) {
            this.ticksCatchableDelay -= l;

            if (this.ticksCatchableDelay <= 0) {
              this.motionY -= 0.20000000298023224D;
              this.playSound(
                  "random.splash",
                  0.25F,
                  1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
              float f8 = (float) MathHelper.floor_double(this.getEntityBoundingBox().minY);
              worldserver.spawnParticle(
                  EnumParticleTypes.WATER_BUBBLE,
                  this.posX,
                  (double) (f8 + 1.0F),
                  this.posZ,
                  (int) (1.0F + this.width * 20.0F),
                  (double) this.width,
                  0.0D,
                  (double) this.width,
                  0.20000000298023224D,
                  new int[0]);
              worldserver.spawnParticle(
                  EnumParticleTypes.WATER_WAKE,
                  this.posX,
                  (double) (f8 + 1.0F),
                  this.posZ,
                  (int) (1.0F + this.width * 20.0F),
                  (double) this.width,
                  0.0D,
                  (double) this.width,
                  0.20000000298023224D,
                  new int[0]);
              this.ticksCatchable = MathHelper.getRandomIntegerInRange(this.rand, 10, 30);
            } else {
              this.fishApproachAngle =
                  (float) ((double) this.fishApproachAngle + this.rand.nextGaussian() * 4.0D);
              float f7 = this.fishApproachAngle * 0.017453292F;
              float f10 = MathHelper.sin(f7);
              float f11 = MathHelper.cos(f7);
              double d13 = this.posX + (double) (f10 * (float) this.ticksCatchableDelay * 0.1F);
              double d15 =
                  (double)
                      ((float) MathHelper.floor_double(this.getEntityBoundingBox().minY) + 1.0F);
              double d16 = this.posZ + (double) (f11 * (float) this.ticksCatchableDelay * 0.1F);
              Block block1 =
                  worldserver
                      .getBlockState(new BlockPos((int) d13, (int) d15 - 1, (int) d16))
                      .getBlock();

              if (block1 == Blocks.water || block1 == Blocks.flowing_water) {
                if (this.rand.nextFloat() < 0.15F) {
                  worldserver.spawnParticle(
                      EnumParticleTypes.WATER_BUBBLE,
                      d13,
                      d15 - 0.10000000149011612D,
                      d16,
                      1,
                      (double) f10,
                      0.1D,
                      (double) f11,
                      0.0D,
                      new int[0]);
                }

                float f3 = f10 * 0.04F;
                float f4 = f11 * 0.04F;
                worldserver.spawnParticle(
                    EnumParticleTypes.WATER_WAKE,
                    d13,
                    d15,
                    d16,
                    0,
                    (double) f4,
                    0.01D,
                    (double) (-f3),
                    1.0D,
                    new int[0]);
                worldserver.spawnParticle(
                    EnumParticleTypes.WATER_WAKE,
                    d13,
                    d15,
                    d16,
                    0,
                    (double) (-f4),
                    0.01D,
                    (double) f3,
                    1.0D,
                    new int[0]);
              }
            }
          } else if (this.ticksCaughtDelay > 0) {
            this.ticksCaughtDelay -= l;
            float f1 = 0.15F;

            if (this.ticksCaughtDelay < 20) {
              f1 = (float) ((double) f1 + (double) (20 - this.ticksCaughtDelay) * 0.05D);
            } else if (this.ticksCaughtDelay < 40) {
              f1 = (float) ((double) f1 + (double) (40 - this.ticksCaughtDelay) * 0.02D);
            } else if (this.ticksCaughtDelay < 60) {
              f1 = (float) ((double) f1 + (double) (60 - this.ticksCaughtDelay) * 0.01D);
            }

            if (this.rand.nextFloat() < f1) {
              float f9 = MathHelper.randomFloatClamp(this.rand, 0.0F, 360.0F) * 0.017453292F;
              float f2 = MathHelper.randomFloatClamp(this.rand, 25.0F, 60.0F);
              double d12 = this.posX + (double) (MathHelper.sin(f9) * f2 * 0.1F);
              double d14 =
                  (double)
                      ((float) MathHelper.floor_double(this.getEntityBoundingBox().minY) + 1.0F);
              double d6 = this.posZ + (double) (MathHelper.cos(f9) * f2 * 0.1F);
              Block block =
                  worldserver
                      .getBlockState(new BlockPos((int) d12, (int) d14 - 1, (int) d6))
                      .getBlock();

              if (block == Blocks.water || block == Blocks.flowing_water) {
                worldserver.spawnParticle(
                    EnumParticleTypes.WATER_SPLASH,
                    d12,
                    d14,
                    d6,
                    2 + this.rand.nextInt(2),
                    0.10000000149011612D,
                    0.0D,
                    0.10000000149011612D,
                    0.0D,
                    new int[0]);
              }
            }

            if (this.ticksCaughtDelay <= 0) {
              this.fishApproachAngle = MathHelper.randomFloatClamp(this.rand, 0.0F, 360.0F);
              this.ticksCatchableDelay = MathHelper.getRandomIntegerInRange(this.rand, 20, 80);
            }
          } else {
            this.ticksCaughtDelay = MathHelper.getRandomIntegerInRange(this.rand, 100, 900);
            this.ticksCaughtDelay -= EnchantmentHelper.getLureModifier(this.angler) * 20 * 5;
          }

          if (this.ticksCatchable > 0) {
            this.motionY -=
                (double) (this.rand.nextFloat() * this.rand.nextFloat() * this.rand.nextFloat())
                    * 0.2D;
          }
        }

        double d11 = d10 * 2.0D - 1.0D;
        this.motionY += 0.03999999910593033D * d11;

        if (d10 > 0.0D) {
          f6 = (float) ((double) f6 * 0.9D);
          this.motionY *= 0.8D;
        }

        this.motionX *= (double) f6;
        this.motionY *= (double) f6;
        this.motionZ *= (double) f6;
        this.setPosition(this.posX, this.posY, this.posZ);
      }
    }
  }

  /** (abstract) Protected helper method to write subclass entity data to NBT. */
  public void writeEntityToNBT(NBTTagCompound tagCompound) {
    tagCompound.setShort("xTile", (short) this.xTile);
    tagCompound.setShort("yTile", (short) this.yTile);
    tagCompound.setShort("zTile", (short) this.zTile);
    ResourceLocation resourcelocation =
        (ResourceLocation) Block.blockRegistry.getNameForObject(this.inTile);
    tagCompound.setString("inTile", resourcelocation == null ? "" : resourcelocation.toString());
    tagCompound.setByte("shake", (byte) this.shake);
    tagCompound.setByte("inGround", (byte) (this.inGround ? 1 : 0));
  }

  /** (abstract) Protected helper method to read subclass entity data from NBT. */
  public void readEntityFromNBT(NBTTagCompound tagCompund) {
    this.xTile = tagCompund.getShort("xTile");
    this.yTile = tagCompund.getShort("yTile");
    this.zTile = tagCompund.getShort("zTile");

    if (tagCompund.hasKey("inTile", 8)) {
      this.inTile = Block.getBlockFromName(tagCompund.getString("inTile"));
    } else {
      this.inTile = Block.getBlockById(tagCompund.getByte("inTile") & 255);
    }

    this.shake = tagCompund.getByte("shake") & 255;
    this.inGround = tagCompund.getByte("inGround") == 1;
  }

  public int handleHookRetraction() {
    if (this.worldObj.isRemote) {
      return 0;
    } else {
      int i = 0;

      if (this.caughtEntity != null) {
        double d0 = this.angler.posX - this.posX;
        double d2 = this.angler.posY - this.posY;
        double d4 = this.angler.posZ - this.posZ;
        double d6 = (double) MathHelper.sqrt_double(d0 * d0 + d2 * d2 + d4 * d4);
        double d8 = 0.1D;
        this.caughtEntity.motionX += d0 * d8;
        this.caughtEntity.motionY += d2 * d8 + (double) MathHelper.sqrt_double(d6) * 0.08D;
        this.caughtEntity.motionZ += d4 * d8;
        i = 3;
      } else if (this.ticksCatchable > 0) {
        EntityItem entityitem =
            new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, this.getFishingResult());
        double d1 = this.angler.posX - this.posX;
        double d3 = this.angler.posY - this.posY;
        double d5 = this.angler.posZ - this.posZ;
        double d7 = (double) MathHelper.sqrt_double(d1 * d1 + d3 * d3 + d5 * d5);
        double d9 = 0.1D;
        entityitem.motionX = d1 * d9;
        entityitem.motionY = d3 * d9 + (double) MathHelper.sqrt_double(d7) * 0.08D;
        entityitem.motionZ = d5 * d9;
        this.worldObj.spawnEntityInWorld(entityitem);
        this.angler.worldObj.spawnEntityInWorld(
            new EntityXPOrb(
                this.angler.worldObj,
                this.angler.posX,
                this.angler.posY + 0.5D,
                this.angler.posZ + 0.5D,
                this.rand.nextInt(6) + 1));
        i = 1;
      }

      if (this.inGround) {
        i = 2;
      }

      this.setDead();
      this.angler.fishEntity = null;
      return i;
    }
  }

  private ItemStack getFishingResult() {
    float f = this.worldObj.rand.nextFloat();
    int i = EnchantmentHelper.getLuckOfSeaModifier(this.angler);
    int j = EnchantmentHelper.getLureModifier(this.angler);
    float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F;
    float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F;
    f1 = MathHelper.clamp_float(f1, 0.0F, 1.0F);
    f2 = MathHelper.clamp_float(f2, 0.0F, 1.0F);

    if (f < f1) {
      this.angler.triggerAchievement(StatList.junkFishedStat);
      return ((WeightedRandomFishable) WeightedRandom.getRandomItem(this.rand, JUNK))
          .getItemStack(this.rand);
    } else {
      f = f - f1;

      if (f < f2) {
        this.angler.triggerAchievement(StatList.treasureFishedStat);
        return ((WeightedRandomFishable) WeightedRandom.getRandomItem(this.rand, TREASURE))
            .getItemStack(this.rand);
      } else {
        float f3 = f - f2;
        this.angler.triggerAchievement(StatList.fishCaughtStat);
        return ((WeightedRandomFishable) WeightedRandom.getRandomItem(this.rand, FISH))
            .getItemStack(this.rand);
      }
    }
  }

  /** Will get destroyed next tick. */
  public void setDead() {
    super.setDead();

    if (this.angler != null) {
      this.angler.fishEntity = null;
    }
  }
}