public void onLivingUpdate() {
    super.onLivingUpdate();
    // if (ridingHelper != null)
    // ridingHelper.onLivingUpdate();
    if (worldObj.isRemote) {
      motionX = motionY = motionZ = 0;
      return;
    }
    this.field_21085_g += this.field_21080_l;
    if (this.field_21085_g > ((float) Math.PI * 2F)) {
      this.field_21085_g -= ((float) Math.PI * 2F);
    }
    if (this.isInWater() && !isSwimming) {
      if (randomMotionSpeed <= swimSpeed / 2) randomMotionSpeed = swimSpeed;
      randomMotionSpeed *= decayRate;

      if (!worldObj.isRemote) {
        motionX = randomMotionVecX * randomMotionSpeed;
        motionY = randomMotionVecY * randomMotionSpeed * 0.05;
        motionZ = randomMotionVecZ * randomMotionSpeed;
      }

      renderYawOffset +=
          ((-(float) Math.atan2(motionX, motionZ) * 180F) / (float) Math.PI - renderYawOffset)
              * 0.1F;
      rotationYaw = renderYawOffset;
    } else {
      surfaceHeight = this.posY;
      this.motionX = 0.0D;
      this.motionY -= 0.08D;
      this.motionY *= 0.9800000190734863D;
      this.motionZ = 0.0D;
    }
  }
  public void onLivingUpdate() {
    super.onLivingUpdate();
    if (riddenByEntity != null) return;
    winge = wingb;
    wingd = wingc;
    wingc = (float) ((double) wingc + (double) (onGround ? -1 : 4) * 0.29999999999999999D);
    if (wingc < 0.0F) {
      wingc = 0.0F;
    }
    if (wingc > 1.0F) {
      wingc = 1.0F;
    }
    if (onGround && !doesLand) motionY = 1F;
    if (!onGround && wingh < 1.0F) {
      wingh = 1.0F;
    }
    wingh = (float) ((double) wingh * 0.90000000000000002D);
    if (!onGround && motionY < 0.0D) {
      motionY *= 0.80000000000000004D;
    }
    wingb += wingh * 2.0F;
    EntityLiving entityliving = getClosestEntityLiving(this, 4D);
    if (entityliving != null && canEntityBeSeen(entityliving)) {
      fleeing = true;
    }
    if (rand.nextInt(300) == 0) {
      fleeing = true;
    }
    if (fleeing) {
      if (FlyToNextTree()) {
        fleeing = false;
      }
      int ai[] = ReturnNearestMaterialCoord(this, Material.leaves, Double.valueOf(16D));
      if (ai[0] == -1) {
        for (int i = 0; i < 2; i++) {
          WingFlap();
        }

        fleeing = false;
      }
      if (rand.nextInt(50) == 0) {
        fleeing = false;
      }
    }
  }
 public void moveEntityWithHeading(float par1, float par2) {
   super.moveEntityWithHeading((float) motionX, (float) motionZ);
   // moveEntity(motionX, motionY, motionZ);
 }
 protected void fall(float f) {
   if (!this.isInWater()) {
     super.fall(f);
   }
 }
  protected void updateEntityActionState() {
    if (riddenByEntity != null) return;
    if (doesLand) {
      if (onGround
          && rand.nextInt(10) == 0
          && (motionX > 0.050000000000000003D
              || motionZ > 0.050000000000000003D
              || motionX < -0.050000000000000003D
              || motionZ < -0.050000000000000003D)) {
        motionY = 0.25D;
      }
      if (!fleeing) {
        super.updateEntityActionState();
      }
    } else {
      if (!this.worldObj.isRemote && this.worldObj.difficultySetting == 0) {
        this.setDead();
      }

      this.despawnEntity();
      double var1 = this.waypointX - this.posX;
      double var3 = this.waypointY - this.posY;
      double var5 = this.waypointZ - this.posZ;
      double var7 = (double) MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);

      if (var7 < 1.0D || var7 > 60.0D) {
        this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
        this.waypointY = this.posY + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
        this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
      }

      if (this.courseChangeCooldown-- <= 0) {
        this.courseChangeCooldown += this.rand.nextInt(5) + 2;

        if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, var7)) {
          this.motionX += var1 / var7 * 0.1D;
          this.motionY += var3 / var7 * 0.1D;
          this.motionZ += var5 / var7 * 0.1D;
        } else {
          this.waypointX = this.posX;
          this.waypointY = this.posY;
          this.waypointZ = this.posZ;
        }
      }
      if (this.isAggressive) {
        if (this.targetedEntity != null && this.targetedEntity.isDead) {
          this.targetedEntity = null;
        }

        if (this.targetedEntity == null || this.aggroCooldown-- <= 0) {
          this.targetedEntity = this.worldObj.getClosestVulnerablePlayerToEntity(this, 100.0D);

          if (this.targetedEntity != null) {
            this.aggroCooldown = 20;
          }
        }

        double var9 = 64.0D;

        if (this.targetedEntity != null
            && ((Entity) this.targetedEntity).getDistanceSqToEntity(this) < var9 * var9) {
          double var11 = this.targetedEntity.posX - this.posX;
          double var13 =
              this.targetedEntity.boundingBox.minY
                  + (double) (this.targetedEntity.height / 2.0F)
                  - (this.posY + (double) (this.height / 2.0F));
          double var15 = this.targetedEntity.posZ - this.posZ;
          this.renderYawOffset =
              this.rotationYaw = -((float) Math.atan2(var11, var15)) * 180.0F / (float) Math.PI;

        } else {
          this.renderYawOffset =
              this.rotationYaw =
                  -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float) Math.PI;

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

        if (!this.worldObj.isRemote) {
          byte var21 = this.dataWatcher.getWatchableObjectByte(16);
          byte var12 = (byte) (this.attackCounter > 10 ? 1 : 0);

          if (var21 != var12) {
            this.dataWatcher.updateObject(16, Byte.valueOf(var12));
          }
        }
      }
    }
  }