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 }