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    }