001 package net.minecraft.src;
002
003 public class EntityAITempt extends EntityAIBase
004 {
005 /** The entity using this AI that is tempted by the player. */
006 private EntityCreature temptedEntity;
007 private float field_75282_b;
008 private double field_75283_c;
009 private double field_75280_d;
010 private double field_75281_e;
011 private double field_75278_f;
012 private double field_75279_g;
013
014 /** The player that is tempting the entity that is using this AI. */
015 private EntityPlayer temptingPlayer;
016
017 /**
018 * A counter that is decremented each time the shouldExecute method is called. The shouldExecute method will always
019 * return false if delayTemptCounter is greater than 0.
020 */
021 private int delayTemptCounter = 0;
022 private boolean field_75287_j;
023
024 /**
025 * This field saves the ID of the items that can be used to breed entities with this behaviour.
026 */
027 private int breedingFood;
028
029 /**
030 * Whether the entity using this AI will be scared by the tempter's sudden movement.
031 */
032 private boolean scaredByPlayerMovement;
033 private boolean field_75286_m;
034
035 public EntityAITempt(EntityCreature par1EntityCreature, float par2, int par3, boolean par4)
036 {
037 this.temptedEntity = par1EntityCreature;
038 this.field_75282_b = par2;
039 this.breedingFood = par3;
040 this.scaredByPlayerMovement = par4;
041 this.setMutexBits(3);
042 }
043
044 /**
045 * Returns whether the EntityAIBase should begin execution.
046 */
047 public boolean shouldExecute()
048 {
049 if (this.delayTemptCounter > 0)
050 {
051 --this.delayTemptCounter;
052 return false;
053 }
054 else
055 {
056 this.temptingPlayer = this.temptedEntity.worldObj.getClosestPlayerToEntity(this.temptedEntity, 10.0D);
057
058 if (this.temptingPlayer == null)
059 {
060 return false;
061 }
062 else
063 {
064 ItemStack var1 = this.temptingPlayer.getCurrentEquippedItem();
065 return var1 == null ? false : var1.itemID == this.breedingFood;
066 }
067 }
068 }
069
070 /**
071 * Returns whether an in-progress EntityAIBase should continue executing
072 */
073 public boolean continueExecuting()
074 {
075 if (this.scaredByPlayerMovement)
076 {
077 if (this.temptedEntity.getDistanceSqToEntity(this.temptingPlayer) < 36.0D)
078 {
079 if (this.temptingPlayer.getDistanceSq(this.field_75283_c, this.field_75280_d, this.field_75281_e) > 0.010000000000000002D)
080 {
081 return false;
082 }
083
084 if (Math.abs((double)this.temptingPlayer.rotationPitch - this.field_75278_f) > 5.0D || Math.abs((double)this.temptingPlayer.rotationYaw - this.field_75279_g) > 5.0D)
085 {
086 return false;
087 }
088 }
089 else
090 {
091 this.field_75283_c = this.temptingPlayer.posX;
092 this.field_75280_d = this.temptingPlayer.posY;
093 this.field_75281_e = this.temptingPlayer.posZ;
094 }
095
096 this.field_75278_f = (double)this.temptingPlayer.rotationPitch;
097 this.field_75279_g = (double)this.temptingPlayer.rotationYaw;
098 }
099
100 return this.shouldExecute();
101 }
102
103 /**
104 * Execute a one shot task or start executing a continuous task
105 */
106 public void startExecuting()
107 {
108 this.field_75283_c = this.temptingPlayer.posX;
109 this.field_75280_d = this.temptingPlayer.posY;
110 this.field_75281_e = this.temptingPlayer.posZ;
111 this.field_75287_j = true;
112 this.field_75286_m = this.temptedEntity.getNavigator().getAvoidsWater();
113 this.temptedEntity.getNavigator().setAvoidsWater(false);
114 }
115
116 /**
117 * Resets the task
118 */
119 public void resetTask()
120 {
121 this.temptingPlayer = null;
122 this.temptedEntity.getNavigator().clearPathEntity();
123 this.delayTemptCounter = 100;
124 this.field_75287_j = false;
125 this.temptedEntity.getNavigator().setAvoidsWater(this.field_75286_m);
126 }
127
128 /**
129 * Updates the task
130 */
131 public void updateTask()
132 {
133 this.temptedEntity.getLookHelper().setLookPositionWithEntity(this.temptingPlayer, 30.0F, (float)this.temptedEntity.getVerticalFaceSpeed());
134
135 if (this.temptedEntity.getDistanceSqToEntity(this.temptingPlayer) < 6.25D)
136 {
137 this.temptedEntity.getNavigator().clearPathEntity();
138 }
139 else
140 {
141 this.temptedEntity.getNavigator().tryMoveToEntityLiving(this.temptingPlayer, this.field_75282_b);
142 }
143 }
144
145 public boolean func_75277_f()
146 {
147 return this.field_75287_j;
148 }
149 }