001 package net.minecraft.src;
002
003 public class EntityAIAttackOnCollide extends EntityAIBase
004 {
005 World worldObj;
006 EntityLiving attacker;
007 EntityLiving entityTarget;
008
009 /**
010 * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0.
011 */
012 int attackTick;
013 float field_75440_e;
014 boolean field_75437_f;
015
016 /** The PathEntity of our entity. */
017 PathEntity entityPathEntity;
018 Class classTarget;
019 private int field_75445_i;
020
021 public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, Class par2Class, float par3, boolean par4)
022 {
023 this(par1EntityLiving, par3, par4);
024 this.classTarget = par2Class;
025 }
026
027 public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, float par2, boolean par3)
028 {
029 this.attackTick = 0;
030 this.attacker = par1EntityLiving;
031 this.worldObj = par1EntityLiving.worldObj;
032 this.field_75440_e = par2;
033 this.field_75437_f = par3;
034 this.setMutexBits(3);
035 }
036
037 /**
038 * Returns whether the EntityAIBase should begin execution.
039 */
040 public boolean shouldExecute()
041 {
042 EntityLiving var1 = this.attacker.getAttackTarget();
043
044 if (var1 == null)
045 {
046 return false;
047 }
048 else if (this.classTarget != null && !this.classTarget.isAssignableFrom(var1.getClass()))
049 {
050 return false;
051 }
052 else
053 {
054 this.entityTarget = var1;
055 this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(this.entityTarget);
056 return this.entityPathEntity != null;
057 }
058 }
059
060 /**
061 * Returns whether an in-progress EntityAIBase should continue executing
062 */
063 public boolean continueExecuting()
064 {
065 EntityLiving var1 = this.attacker.getAttackTarget();
066 return var1 == null ? false : (!this.entityTarget.isEntityAlive() ? false : (!this.field_75437_f ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(this.entityTarget.posX), MathHelper.floor_double(this.entityTarget.posY), MathHelper.floor_double(this.entityTarget.posZ))));
067 }
068
069 /**
070 * Execute a one shot task or start executing a continuous task
071 */
072 public void startExecuting()
073 {
074 this.attacker.getNavigator().setPath(this.entityPathEntity, this.field_75440_e);
075 this.field_75445_i = 0;
076 }
077
078 /**
079 * Resets the task
080 */
081 public void resetTask()
082 {
083 this.entityTarget = null;
084 this.attacker.getNavigator().clearPathEntity();
085 }
086
087 /**
088 * Updates the task
089 */
090 public void updateTask()
091 {
092 this.attacker.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F);
093
094 if ((this.field_75437_f || this.attacker.getEntitySenses().canSee(this.entityTarget)) && --this.field_75445_i <= 0)
095 {
096 this.field_75445_i = 4 + this.attacker.getRNG().nextInt(7);
097 this.attacker.getNavigator().tryMoveToEntityLiving(this.entityTarget, this.field_75440_e);
098 }
099
100 this.attackTick = Math.max(this.attackTick - 1, 0);
101 double var1 = (double)(this.attacker.width * 2.0F * this.attacker.width * 2.0F);
102
103 if (this.attacker.getDistanceSq(this.entityTarget.posX, this.entityTarget.boundingBox.minY, this.entityTarget.posZ) <= var1)
104 {
105 if (this.attackTick <= 0)
106 {
107 this.attackTick = 20;
108
109 if (this.attacker.getHeldItem() != null)
110 {
111 this.attacker.swingItem();
112 }
113
114 this.attacker.attackEntityAsMob(this.entityTarget);
115 }
116 }
117 }
118 }