BloodMagic/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java

167 lines
5.1 KiB
Java

package WayofTime.bloodmagic.entity.ai;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.item.ItemBow;
import net.minecraft.util.EnumHand;
import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter;
public class EntityAIAttackRangedBow extends EntityAIBase
{
private final EntitySentientSpecter entity;
private final double moveSpeedAmp;
private int attackCooldown;
private final float maxAttackDistance;
private int attackTime = -1;
private int seeTime;
private boolean strafingClockwise;
private boolean strafingBackwards;
private int strafingTime = -1;
public EntityAIAttackRangedBow(EntitySentientSpecter specter, double speedAmplifier, int delay, float maxDistance)
{
this.entity = specter;
this.moveSpeedAmp = speedAmplifier;
this.attackCooldown = delay;
this.maxAttackDistance = maxDistance * maxDistance;
this.setMutexBits(3);
}
public void setAttackCooldown(int p_189428_1_)
{
this.attackCooldown = p_189428_1_;
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
public boolean shouldExecute()
{
return this.entity.getAttackTarget() == null ? false : this.isBowInMainhand();
}
protected boolean isBowInMainhand()
{
return this.entity.getHeldItemMainhand() != null && this.entity.getHeldItemMainhand().getItem() instanceof ItemBow;
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
public boolean continueExecuting()
{
return (this.shouldExecute() || !this.entity.getNavigator().noPath()) && this.isBowInMainhand();
}
/**
* Execute a one shot task or start executing a continuous task
*/
public void startExecuting()
{
super.startExecuting();
// this.entity.setSwingingArms(true);
}
/**
* Resets the task
*/
public void resetTask()
{
super.startExecuting();
// this.entity.setSwingingArms(false);
this.seeTime = 0;
this.attackTime = -1;
this.entity.resetActiveHand();
}
/**
* Updates the task
*/
public void updateTask()
{
EntityLivingBase entitylivingbase = this.entity.getAttackTarget();
if (entitylivingbase != null)
{
double d0 = this.entity.getDistanceSq(entitylivingbase.posX, entitylivingbase.getEntityBoundingBox().minY, entitylivingbase.posZ);
boolean flag = this.entity.getEntitySenses().canSee(entitylivingbase);
boolean flag1 = this.seeTime > 0;
if (flag != flag1)
{
this.seeTime = 0;
}
if (flag)
{
++this.seeTime;
} else
{
--this.seeTime;
}
if (d0 <= (double) this.maxAttackDistance && this.seeTime >= 20)
{
this.entity.getNavigator().clearPathEntity();
++this.strafingTime;
} else
{
this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.moveSpeedAmp);
this.strafingTime = -1;
}
if (this.strafingTime >= 20)
{
if ((double) this.entity.getRNG().nextFloat() < 0.3D)
{
this.strafingClockwise = !this.strafingClockwise;
}
if ((double) this.entity.getRNG().nextFloat() < 0.3D)
{
this.strafingBackwards = !this.strafingBackwards;
}
this.strafingTime = 0;
}
if (this.strafingTime > -1)
{
if (d0 > (double) (this.maxAttackDistance * 0.75F))
{
this.strafingBackwards = false;
} else if (d0 < (double) (this.maxAttackDistance * 0.25F))
{
this.strafingBackwards = true;
}
this.entity.getMoveHelper().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F);
this.entity.faceEntity(entitylivingbase, 30.0F, 30.0F);
} else
{
this.entity.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F);
}
if (this.entity.isHandActive())
{
if (!flag && this.seeTime < -60)
{
this.entity.resetActiveHand();
} else if (flag)
{
int i = this.entity.getItemInUseMaxCount();
if (i >= 20)
{
this.entity.resetActiveHand();
this.entity.attackEntityWithRangedAttack(entitylivingbase, ItemBow.getArrowVelocity(i));
this.attackTime = this.attackCooldown;
}
}
} else if (--this.attackTime <= 0 && this.seeTime >= -60)
{
this.entity.setActiveHand(EnumHand.MAIN_HAND);
}
}
}
}