mirror of
https://github.com/KAMKEEL/CustomNPC-Plus.git
synced 2026-11-13 04:17:36 +00:00
63 lines
2.4 KiB
Java
63 lines
2.4 KiB
Java
package noppes.npcs.ai;
|
|||
|
|
|
||
|
|
import net.minecraft.entity.EntityLivingBase;
|
||
|
|
import net.minecraft.entity.ai.EntityAIBase;
|
||
|
|
import net.minecraft.util.MathHelper;
|
||
|
|
import noppes.npcs.entity.EntityNPCInterface;
|
||
|
|
|
||
|
|
public class EntityAIPounceTarget extends EntityAIBase {
|
||
|
|
private EntityNPCInterface npc;
|
||
|
|
private EntityLivingBase leapTarget;
|
||
|
|
private float leapSpeed = 1.2F;
|
||
|
|
|
||
|
|
public EntityAIPounceTarget(EntityNPCInterface leapingEntity){
|
||
|
|
this.npc = leapingEntity;
|
||
|
|
this.setMutexBits(4);
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public boolean shouldExecute(){
|
||
|
|
if(!this.npc.onGround)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
this.leapTarget = this.npc.getAttackTarget();
|
||
|
|
|
||
|
|
if (this.leapTarget == null || !this.npc.getEntitySenses().canSee(leapTarget))
|
||
|
|
return false;
|
||
|
|
|
||
|
|
return !npc.isInRange(leapTarget, 4) && npc.isInRange(leapTarget, 8) && this.npc.getRNG().nextInt(5) == 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public boolean continueExecuting(){
|
||
|
|
return !this.npc.onGround;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public void startExecuting(){
|
||
|
|
double varX = this.leapTarget.posX - this.npc.posX;
|
||
|
|
double varY = this.leapTarget.boundingBox.minY - this.npc.boundingBox.minY;
|
||
|
|
double varZ = this.leapTarget.posZ - this.npc.posZ;
|
||
|
|
float varF = MathHelper.sqrt_double(varX * varX + varZ * varZ);
|
||
|
|
float angle = this.getAngleForXYZ(varX, varY, varZ, varF);
|
||
|
|
float yaw = (float)(Math.atan2(varX, varZ) * 180.0D / Math.PI);
|
||
|
|
this.npc.motionX = (double)(MathHelper.sin(yaw / 180.0F * (float)Math.PI) * MathHelper.cos(angle / 180.0F * (float)Math.PI));
|
||
|
|
this.npc.motionZ = (double)(MathHelper.cos(yaw / 180.0F * (float)Math.PI) * MathHelper.cos(angle / 180.0F * (float)Math.PI));
|
||
|
|
this.npc.motionY = (double)(MathHelper.sin((angle + 1.0F) / 180.0F * (float)Math.PI));
|
||
|
|
this.npc.motionX *= this.leapSpeed;
|
||
|
|
this.npc.motionZ *= this.leapSpeed;
|
||
|
|
this.npc.motionY *= this.leapSpeed;
|
||
|
|
}
|
||
|
|
|
||
|
|
public float getAngleForXYZ(double varX, double varY, double varZ, double horiDist) {
|
||
|
|
float g = 0.1F;
|
||
|
|
float var1 = this.leapSpeed * this.leapSpeed;
|
||
|
|
double var2 = (g * horiDist);
|
||
|
|
double var3 = ((g * horiDist * horiDist) + (2 * varY * var1));
|
||
|
|
double var4 = (var1 * var1) - (g * var3);
|
||
|
|
if (var4 < 0) return 90.0F;
|
||
|
|
float var6 = var1 - MathHelper.sqrt_double(var4);
|
||
|
|
float var7 = (float) (Math.atan2(var6 , var2) * 180.0D / Math.PI);
|
||
|
|
return var7;
|
||
|
|
}
|
||
|
|
}
|