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