001    package net.minecraft.src;
002    
003    public class EntityAIControlledByPlayer extends EntityAIBase
004    {
005        private final EntityLiving field_82640_a;
006        private final float field_82638_b;
007        private float field_82639_c = 0.0F;
008        private boolean field_82636_d = false;
009        private int field_82637_e = 0;
010        private int field_82635_f = 0;
011    
012        public EntityAIControlledByPlayer(EntityLiving par1EntityLiving, float par2)
013        {
014            this.field_82640_a = par1EntityLiving;
015            this.field_82638_b = par2;
016            this.setMutexBits(7);
017        }
018    
019        /**
020         * Execute a one shot task or start executing a continuous task
021         */
022        public void startExecuting()
023        {
024            this.field_82639_c = 0.0F;
025        }
026    
027        /**
028         * Resets the task
029         */
030        public void resetTask()
031        {
032            this.field_82636_d = false;
033            this.field_82639_c = 0.0F;
034        }
035    
036        /**
037         * Returns whether the EntityAIBase should begin execution.
038         */
039        public boolean shouldExecute()
040        {
041            return this.field_82640_a.isEntityAlive() && this.field_82640_a.riddenByEntity != null && this.field_82640_a.riddenByEntity instanceof EntityPlayer && (this.field_82636_d || this.field_82640_a.func_82171_bF());
042        }
043    
044        /**
045         * Updates the task
046         */
047        public void updateTask()
048        {
049            EntityPlayer var1 = (EntityPlayer)this.field_82640_a.riddenByEntity;
050            EntityCreature var2 = (EntityCreature)this.field_82640_a;
051            float var3 = MathHelper.wrapAngleTo180_float(var1.rotationYaw - this.field_82640_a.rotationYaw) * 0.5F;
052    
053            if (var3 > 5.0F)
054            {
055                var3 = 5.0F;
056            }
057    
058            if (var3 < -5.0F)
059            {
060                var3 = -5.0F;
061            }
062    
063            this.field_82640_a.rotationYaw = MathHelper.wrapAngleTo180_float(this.field_82640_a.rotationYaw + var3);
064    
065            if (this.field_82639_c < this.field_82638_b)
066            {
067                this.field_82639_c += (this.field_82638_b - this.field_82639_c) * 0.01F;
068            }
069    
070            if (this.field_82639_c > this.field_82638_b)
071            {
072                this.field_82639_c = this.field_82638_b;
073            }
074    
075            int var4 = MathHelper.floor_double(this.field_82640_a.posX);
076            int var5 = MathHelper.floor_double(this.field_82640_a.posY);
077            int var6 = MathHelper.floor_double(this.field_82640_a.posZ);
078            float var7 = this.field_82639_c;
079    
080            if (this.field_82636_d)
081            {
082                if (this.field_82637_e++ > this.field_82635_f)
083                {
084                    this.field_82636_d = false;
085                }
086    
087                var7 += var7 * 1.15F * MathHelper.sin((float)this.field_82637_e / (float)this.field_82635_f * (float)Math.PI);
088            }
089    
090            float var8 = 0.91F;
091    
092            if (this.field_82640_a.onGround)
093            {
094                var8 = 0.54600006F;
095                int var9 = this.field_82640_a.worldObj.getBlockId(MathHelper.floor_float((float)var4), MathHelper.floor_float((float)var5) - 1, MathHelper.floor_float((float)var6));
096    
097                if (var9 > 0)
098                {
099                    var8 = Block.blocksList[var9].slipperiness * 0.91F;
100                }
101            }
102    
103            float var21 = 0.16277136F / (var8 * var8 * var8);
104            float var10 = MathHelper.sin(var2.rotationYaw * (float)Math.PI / 180.0F);
105            float var11 = MathHelper.cos(var2.rotationYaw * (float)Math.PI / 180.0F);
106            float var12 = var2.getAIMoveSpeed() * var21;
107            float var13 = Math.max(var7, 1.0F);
108            var13 = var12 / var13;
109            float var14 = var7 * var13;
110            float var15 = -(var14 * var10);
111            float var16 = var14 * var11;
112    
113            if (MathHelper.abs(var15) > MathHelper.abs(var16))
114            {
115                if (var15 < 0.0F)
116                {
117                    var15 -= this.field_82640_a.width / 2.0F;
118                }
119    
120                if (var15 > 0.0F)
121                {
122                    var15 += this.field_82640_a.width / 2.0F;
123                }
124    
125                var16 = 0.0F;
126            }
127            else
128            {
129                var15 = 0.0F;
130    
131                if (var16 < 0.0F)
132                {
133                    var16 -= this.field_82640_a.width / 2.0F;
134                }
135    
136                if (var16 > 0.0F)
137                {
138                    var16 += this.field_82640_a.width / 2.0F;
139                }
140            }
141    
142            int var17 = MathHelper.floor_double(this.field_82640_a.posX + (double)var15);
143            int var18 = MathHelper.floor_double(this.field_82640_a.posZ + (double)var16);
144            PathPoint var19 = new PathPoint(MathHelper.floor_float(this.field_82640_a.width + 1.0F), MathHelper.floor_float(this.field_82640_a.height + var1.height + 1.0F), MathHelper.floor_float(this.field_82640_a.width + 1.0F));
145    
146            if ((var4 != var17 || var6 != var18) && PathFinder.func_82565_a(this.field_82640_a, var17, var5, var18, var19, false, false, true) == 0 && PathFinder.func_82565_a(this.field_82640_a, var4, var5 + 1, var6, var19, false, false, true) == 1 && PathFinder.func_82565_a(this.field_82640_a, var17, var5 + 1, var18, var19, false, false, true) == 1)
147            {
148                var2.getJumpHelper().setJumping();
149            }
150    
151            if (!var1.capabilities.isCreativeMode && this.field_82639_c >= this.field_82638_b * 0.5F && this.field_82640_a.getRNG().nextFloat() < 0.006F && !this.field_82636_d)
152            {
153                ItemStack var20 = var1.getHeldItem();
154    
155                if (var20 != null && var20.itemID == Item.field_82793_bR.shiftedIndex)
156                {
157                    var20.damageItem(1, var1);
158    
159                    if (var20.stackSize == 0)
160                    {
161                        var1.inventory.mainInventory[var1.inventory.currentItem] = new ItemStack(Item.fishingRod);
162                    }
163                }
164            }
165    
166            this.field_82640_a.moveEntityWithHeading(0.0F, var7);
167        }
168    
169        public boolean func_82634_f()
170        {
171            return this.field_82636_d;
172        }
173    
174        public void func_82632_g()
175        {
176            this.field_82636_d = true;
177            this.field_82637_e = 0;
178            this.field_82635_f = this.field_82640_a.getRNG().nextInt(841) + 140;
179        }
180    
181        public boolean func_82633_h()
182        {
183            return !this.func_82634_f() && this.field_82639_c > this.field_82638_b * 0.3F;
184        }
185    }