BloodMagic/src/main/java/WayofTime/alchemicalWizardry/common/demonVillage/ai/EntityAIOccasionalRangedAttack.java
2015-07-29 08:23:01 -04:00

165 lines
No EOL
5.2 KiB
Java

package WayofTime.alchemicalWizardry.common.demonVillage.ai;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.util.MathHelper;
public class EntityAIOccasionalRangedAttack extends EntityAIBase
{
/** The entity the AI instance has been applied to */
private final EntityLiving entityHost;
/** The entity (as a RangedAttackMob) the AI instance has been applied to. */
private final IOccasionalRangedAttackMob rangedAttackEntityHost;
private EntityLivingBase attackTarget;
/**
* A decrementing tick that spawns a ranged attack once this value reaches 0. It is then set back to the
* maxRangedAttackTime.
*/
private int rangedAttackTime;
private double entityMoveSpeed;
private int field_75318_f;
private int field_96561_g;
/** The maximum time the AI has to wait before peforming another ranged attack. */
private int maxRangedAttackTime;
private float field_96562_i;
private float field_82642_h;
private double range;
public EntityAIOccasionalRangedAttack(IOccasionalRangedAttackMob p_i1649_1_, double p_i1649_2_, int p_i1649_4_, float p_i1649_5_, double range)
{
this(p_i1649_1_, p_i1649_2_, p_i1649_4_, p_i1649_4_, p_i1649_5_, range);
}
public EntityAIOccasionalRangedAttack(IOccasionalRangedAttackMob p_i1650_1_, double p_i1650_2_, int p_i1650_4_, int p_i1650_5_, float p_i1650_6_, double range)
{
this.rangedAttackTime = -1;
if (!(p_i1650_1_ instanceof EntityLivingBase))
{
throw new IllegalArgumentException("ArrowAttackGoal requires Mob implements RangedAttackMob");
}
else
{
this.rangedAttackEntityHost = p_i1650_1_;
this.entityHost = (EntityLiving)p_i1650_1_;
this.entityMoveSpeed = p_i1650_2_;
this.field_96561_g = p_i1650_4_;
this.maxRangedAttackTime = p_i1650_5_;
this.field_96562_i = p_i1650_6_;
this.field_82642_h = p_i1650_6_ * p_i1650_6_;
this.setMutexBits(3);
this.range = range;
}
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
public boolean shouldExecute()
{
EntityLivingBase entitylivingbase = this.entityHost.getAttackTarget();
if (entitylivingbase == null)
{
return false;
}
else if(this.rangedAttackEntityHost.shouldUseRangedAttack() && this.isInRange(entitylivingbase))
{
this.attackTarget = entitylivingbase;
return true;
}else
{
return false;
}
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
public boolean continueExecuting()
{
return this.shouldExecute() || !this.entityHost.getNavigator().noPath() && this.rangedAttackEntityHost.shouldUseRangedAttack();
}
public boolean isInRange(EntityLivingBase target)
{
double xf = target.posX;
double yf = target.posY;
double zf = target.posZ;
double xi = this.entityHost.posX;
double yi = this.entityHost.posY;
double zi = this.entityHost.posZ;
return (xi-xf)*(xi-xf) + (yi-yf)*(yi-yf) + (zi-zf)*(zi-zf) >= range*range;
}
/**
* Resets the task
*/
public void resetTask()
{
this.attackTarget = null;
this.field_75318_f = 0;
this.rangedAttackTime = -1;
}
/**
* Updates the task
*/
public void updateTask()
{
double d0 = this.entityHost.getDistanceSq(this.attackTarget.posX, this.attackTarget.getBoundingBox().minY, this.attackTarget.posZ);
boolean flag = this.entityHost.getEntitySenses().canSee(this.attackTarget);
if (flag)
{
++this.field_75318_f;
}
else
{
this.field_75318_f = 0;
}
if (d0 <= (double)this.field_82642_h && this.field_75318_f >= 20)
{
this.entityHost.getNavigator().clearPathEntity();
}
else
{
this.entityHost.getNavigator().tryMoveToEntityLiving(this.attackTarget, this.entityMoveSpeed);
}
this.entityHost.getLookHelper().setLookPositionWithEntity(this.attackTarget, 30.0F, 30.0F);
float f;
if (--this.rangedAttackTime == 0)
{
if (d0 > (double)this.field_82642_h || !flag)
{
return;
}
f = MathHelper.sqrt_double(d0) / this.field_96562_i;
float f1 = f;
if (f < 0.1F)
{
f1 = 0.1F;
}
if (f1 > 1.0F)
{
f1 = 1.0F;
}
this.rangedAttackEntityHost.attackEntityWithRangedAttack(this.attackTarget, f1);
this.rangedAttackTime = MathHelper.floor_float(f * (float)(this.maxRangedAttackTime - this.field_96561_g) + (float)this.field_96561_g);
}
else if (this.rangedAttackTime < 0)
{
f = MathHelper.sqrt_double(d0) / this.field_96562_i;
this.rangedAttackTime = MathHelper.floor_float(f * (float)(this.maxRangedAttackTime - this.field_96561_g) + (float)this.field_96561_g);
}
}
}