package net.minecraft.entity.ai; import net.minecraft.entity.EntityLiving; import net.minecraft.pathfinding.PathEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class EntityAIAttackOnCollide extends EntityAIBase { World worldObj; EntityLiving attacker; EntityLiving entityTarget; /** * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0. */ int attackTick; float field_75440_e; boolean field_75437_f; /** The PathEntity of our entity. */ PathEntity entityPathEntity; Class classTarget; private int field_75445_i; public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, Class par2Class, float par3, boolean par4) { this(par1EntityLiving, par3, par4); this.classTarget = par2Class; } public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, float par2, boolean par3) { this.attackTick = 0; this.attacker = par1EntityLiving; this.worldObj = par1EntityLiving.worldObj; this.field_75440_e = par2; this.field_75437_f = par3; this.setMutexBits(3); } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { EntityLiving entityliving = this.attacker.getAttackTarget(); if (entityliving == null) { return false; } else if (this.classTarget != null && !this.classTarget.isAssignableFrom(entityliving.getClass())) { return false; } else { this.entityTarget = entityliving; this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(this.entityTarget); return this.entityPathEntity != null; } } /** * Returns whether an in-progress EntityAIBase should continue executing */ public boolean continueExecuting() { EntityLiving entityliving = this.attacker.getAttackTarget(); return entityliving == 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)))); } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.attacker.getNavigator().setPath(this.entityPathEntity, this.field_75440_e); this.field_75445_i = 0; } /** * Resets the task */ public void resetTask() { this.entityTarget = null; this.attacker.getNavigator().clearPathEntity(); } /** * Updates the task */ public void updateTask() { this.attacker.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F); if ((this.field_75437_f || this.attacker.getEntitySenses().canSee(this.entityTarget)) && --this.field_75445_i <= 0) { this.field_75445_i = 4 + this.attacker.getRNG().nextInt(7); this.attacker.getNavigator().tryMoveToEntityLiving(this.entityTarget, this.field_75440_e); } this.attackTick = Math.max(this.attackTick - 1, 0); double d0 = (double)(this.attacker.width * 2.0F * this.attacker.width * 2.0F); if (this.attacker.getDistanceSq(this.entityTarget.posX, this.entityTarget.boundingBox.minY, this.entityTarget.posZ) <= d0) { if (this.attackTick <= 0) { this.attackTick = 20; if (this.attacker.getHeldItem() != null) { this.attacker.swingItem(); } this.attacker.attackEntityAsMob(this.entityTarget); } } } }