private void tryMoveToSpiderRod() {
    final Point3D nearestRod = RadixLogic.getFirstNearestBlock(this, ModBlocks.spiderRod, 10);

    if (nearestRod != null
        && RadixMath.getDistanceToXYZ(
                nearestRod.dPosX, nearestRod.dPosY, nearestRod.dPosZ, posX, posY, posZ)
            > 5.0D) {
      getNavigator().tryMoveToXYZ(nearestRod.dPosX, nearestRod.dPosY, nearestRod.dPosZ, 0.4D);
    }
  }
  private void setPathToFurnace() {
    final double distanceToFurnace = RadixMath.getDistanceToXYZ(owner, furnacePos);

    if (owner.getNavigator().noPath() && distanceToFurnace >= 2.5D) {
      owner
          .getNavigator()
          .setPath(
              owner
                  .getNavigator()
                  .getPathToXYZ(furnacePos.iPosX, furnacePos.iPosY, furnacePos.iPosZ),
              owner.getSpeed());
    }
  }
  private void doCookFood() {
    final double distanceToFurnace = RadixMath.getDistanceToXYZ(owner, furnacePos);

    if (distanceToFurnace <= 2.5D) {
      if (isCooking) {
        if (cookingTicks <= cookingInterval) {
          if (BlockHelper.getBlock(
                  owner.worldObj, furnacePos.iPosX, furnacePos.iPosY, furnacePos.iPosZ)
              != Blocks.lit_furnace) {
            BlockHelper.updateFurnaceState(
                true, owner.worldObj, furnacePos.iPosX, furnacePos.iPosY, furnacePos.iPosZ);
          }

          cookingTicks++;
        } else {
          CookableFood foodObj = RegistryMCA.getCookableFoodList().get(indexOfCookingFood);
          int rawFoodSlot = owner.getInventory().getFirstSlotContainingItem(foodObj.getFoodRaw());

          if (rawFoodSlot > -1) {
            owner.getInventory().decrStackSize(rawFoodSlot, 1);
            addItemStackToInventory(new ItemStack(foodObj.getFoodCooked(), 1, 0));
            owner.swingItem();
          } else {
            EntityPlayer player = getAssigningPlayer();

            if (player != null) {
              owner.sayRaw("I don't have any food to cook.", player); // TODO Translate.
            }

            reset();
          }

          isCooking = false;
          hasCookableFood = false;
          cookingTicks = 0;
          fuelUsesRemaining--;
          BlockHelper.updateFurnaceState(
              false, owner.worldObj, furnacePos.iPosX, furnacePos.iPosY, furnacePos.iPosZ);

          if (fuelUsesRemaining <= 0) {
            hasFuel = false;
          }
        }
      } else {
        owner.swingItem();
        isCooking = true;
      }
    }
  }
  @Override
  public void onUpdateServer() {
    if (!MCA.getConfig().allowHuntingChore) {
      this.notifyAssigningPlayer(Color.RED + "This chore is disabled.");
      reset();
      return;
    }

    if (standPoint.iPosX == 0 && standPoint.iPosY == 0 && standPoint.iPosZ == 0) {
      // Find a point to stand at and hunt.
      List<Point3D> grassBlocks = RadixLogic.getNearbyBlocks(owner, Blocks.grass, 15);

      if (grassBlocks.size() > 0) {
        standPoint = grassBlocks.get(RadixMath.getNumberInRange(0, grassBlocks.size() - 1));
      } else {
        owner.say("hunting.badspot", getAssigningPlayer());
        reset();
      }

      return;
    }

    if (RadixMath.getDistanceToXYZ(owner, standPoint) >= 5.0F && owner.getNavigator().noPath()) {
      boolean successful =
          owner
              .getNavigator()
              .tryMoveToXYZ(standPoint.dPosX, standPoint.dPosY, standPoint.dPosZ, owner.getSpeed());

      if (!successful) {
        owner.say("hunting.badspot", getAssigningPlayer());
        reset();
      }
    } else if (RadixMath.getDistanceToXYZ(owner, standPoint) < 5.0F) {
      ticksActive++;

      if (ticksActive >= Time.SECOND * 20) {
        boolean doSpawn = owner.worldObj.rand.nextBoolean();

        if (doSpawn) {
          try {
            final Class entityClass = RegistryMCA.getRandomHuntingEntity(isTaming);
            final EntityLiving entity =
                (EntityLiving)
                    entityClass.getDeclaredConstructor(World.class).newInstance(owner.worldObj);
            final List<Point3D> nearbyGrass = RadixLogic.getNearbyBlocks(owner, Blocks.grass, 3);
            final Point3D spawnPoint =
                nearbyGrass.get(owner.worldObj.rand.nextInt(nearbyGrass.size()));

            if (spawnPoint != null) {
              entity.setPosition(spawnPoint.iPosX, spawnPoint.iPosY + 1, spawnPoint.iPosZ);
            }

            owner.worldObj.spawnEntityInWorld(entity);

            if (!isTaming) {
              entity.attackEntityFrom(DamageSource.generic, 100.0F);
              owner.swingItem();
            }
          } catch (Exception e) {
            RadixExcept.logErrorCatch(
                e,
                "There was an error spawning an entity for the hunting AI. If you are using a mod that expands MCA's hunting AI, it is likely the problem!");
          }
        }

        List<Entity> nearbyItems =
            RadixLogic.getAllEntitiesOfTypeWithinDistance(EntityItem.class, owner, 5);

        if (nearbyItems.size() != 0) {
          for (Entity entity : nearbyItems) {
            EntityItem item = (EntityItem) entity;
            ItemStack stack = item.getEntityItem();

            addItemStackToInventory(stack);
            item.setDead();
          }
        }

        ticksActive = 0;
      }
    }
  }