165 lines
No EOL
5.2 KiB
Java
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);
|
|
}
|
|
}
|
|
} |