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