    001    package net.minecraft.entity;
    002
    003    import net.minecraft.block.Block;
    004    import net.minecraft.util.MathHelper;
    005    import net.minecraft.world.World;
    006
    007    public abstract class EntityFlying extends EntityLiving
    008    {
    009        public EntityFlying(World par1World)
    010        {
    011            super(par1World);
    012        }
    013
    014        /**
    015         * Called when the mob is falling. Calculates and applies fall damage.
    016         */
    017        protected void fall(float par1) {}
    018
    019        /**
    020         * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance
    021         * and deal fall damage if landing on the ground.  Args: distanceFallenThisTick, onGround
    022         */
    023        protected void updateFallState(double par1, boolean par3) {}
    024
    025        /**
    026         * Moves the entity based on the specified heading.  Args: strafe, forward
    027         */
    028        public void moveEntityWithHeading(float par1, float par2)
    029        {
    030            if (this.isInWater())
    031            {
    032                this.moveFlying(par1, par2, 0.02F);
    033                this.moveEntity(this.motionX, this.motionY, this.motionZ);
    034                this.motionX *= 0.800000011920929D;
    035                this.motionY *= 0.800000011920929D;
    036                this.motionZ *= 0.800000011920929D;
    037            }
    038            else if (this.handleLavaMovement())
    039            {
    040                this.moveFlying(par1, par2, 0.02F);
    041                this.moveEntity(this.motionX, this.motionY, this.motionZ);
    042                this.motionX *= 0.5D;
    043                this.motionY *= 0.5D;
    044                this.motionZ *= 0.5D;
    045            }
    046            else
    047            {
    048                float var3 = 0.91F;
    049
    050                if (this.onGround)
    051                {
    052                    var3 = 0.54600006F;
    053                    int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
    054
    055                    if (var4 > 0)
    056                    {
    057                        var3 = Block.blocksList[var4].slipperiness * 0.91F;
    058                    }
    059                }
    060
    061                float var8 = 0.16277136F / (var3 * var3 * var3);
    062                this.moveFlying(par1, par2, this.onGround ? 0.1F * var8 : 0.02F);
    063                var3 = 0.91F;
    064
    065                if (this.onGround)
    066                {
    067                    var3 = 0.54600006F;
    068                    int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
    069
    070                    if (var5 > 0)
    071                    {
    072                        var3 = Block.blocksList[var5].slipperiness * 0.91F;
    073                    }
    074                }
    075
    076                this.moveEntity(this.motionX, this.motionY, this.motionZ);
    077                this.motionX *= (double)var3;
    078                this.motionY *= (double)var3;
    079                this.motionZ *= (double)var3;
    080            }
    081
    082            this.prevLegYaw = this.legYaw;
    083            double var10 = this.posX - this.prevPosX;
    084            double var9 = this.posZ - this.prevPosZ;
    085            float var7 = MathHelper.sqrt_double(var10 * var10 + var9 * var9) * 4.0F;
    086
    087            if (var7 > 1.0F)
    088            {
    089                var7 = 1.0F;
    090            }
    091
    092            this.legYaw += (var7 - this.legYaw) * 0.4F;
    093            this.legSwing += this.legYaw;
    094        }
    095
    096        /**
    097         * returns true if this entity is by a ladder, false otherwise
    098         */
    099        public boolean isOnLadder()
    100        {
    101            return false;
    102        }
    103    }