mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
165 lines
5.0 KiB
Java
165 lines
5.0 KiB
Java
package com.hbm.entity.mob.ai;
|
|
|
|
import net.minecraft.entity.EntityCreature;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.ai.EntityAIBase;
|
|
import net.minecraft.pathfinding.PathEntity;
|
|
import net.minecraft.pathfinding.PathPoint;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
|
|
public class EntityAIMaskmanCasualApproach extends EntityAIBase {
|
|
|
|
World worldObj;
|
|
EntityCreature attacker;
|
|
int attackTick;
|
|
double speedTowardsTarget;
|
|
boolean longMemory;
|
|
PathEntity entityPathEntity;
|
|
Class classTarget;
|
|
private int pathTimer;
|
|
private double lastX;
|
|
private double lastY;
|
|
private double lastZ;
|
|
|
|
private int failedPathFindingPenalty;
|
|
|
|
public EntityAIMaskmanCasualApproach(EntityCreature owner, Class target, double speed, boolean longMemory) {
|
|
this(owner, speed, longMemory);
|
|
this.classTarget = target;
|
|
}
|
|
|
|
public EntityAIMaskmanCasualApproach(EntityCreature owner, double speed, boolean longMemory) {
|
|
this.attacker = owner;
|
|
this.worldObj = owner.worldObj;
|
|
this.speedTowardsTarget = speed;
|
|
this.longMemory = longMemory;
|
|
this.setMutexBits(3);
|
|
}
|
|
|
|
public boolean shouldExecute() {
|
|
EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
|
|
|
|
if(entitylivingbase == null) {
|
|
return false;
|
|
|
|
} else if(!entitylivingbase.isEntityAlive()) {
|
|
return false;
|
|
|
|
} else if(this.classTarget != null && !this.classTarget.isAssignableFrom(entitylivingbase.getClass())) {
|
|
return false;
|
|
|
|
} else {
|
|
|
|
if(--this.pathTimer <= 0) {
|
|
|
|
double[] pos = getApproachPos();
|
|
this.entityPathEntity = this.attacker.getNavigator().getPathToXYZ(pos[0], pos[1], pos[2]);
|
|
this.pathTimer = 4 + this.attacker.getRNG().nextInt(7);
|
|
return this.entityPathEntity != null;
|
|
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public boolean continueExecuting() {
|
|
|
|
EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
|
|
|
|
return entitylivingbase == null ? false
|
|
: (!entitylivingbase.isEntityAlive() ? false
|
|
: (!this.longMemory ? !this.attacker.getNavigator().noPath()
|
|
: this.attacker.isWithinHomeDistance(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posY), MathHelper.floor_double(entitylivingbase.posZ))));
|
|
}
|
|
|
|
|
|
public void startExecuting() {
|
|
this.attacker.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget);
|
|
this.pathTimer = 0;
|
|
}
|
|
|
|
|
|
public void resetTask() {
|
|
this.attacker.getNavigator().clearPathEntity();
|
|
}
|
|
|
|
|
|
public void updateTask() {
|
|
|
|
EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
|
|
this.attacker.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F);
|
|
double d0 = this.attacker.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ);
|
|
|
|
this.pathTimer--;
|
|
|
|
if((this.longMemory || this.attacker.getEntitySenses().canSee(entitylivingbase)) && this.pathTimer <= 0
|
|
&& (this.lastX == 0.0D && this.lastY == 0.0D && this.lastZ == 0.0D
|
|
|| entitylivingbase.getDistanceSq(this.lastX, this.lastY, this.lastZ) >= 1.0D
|
|
|| this.attacker.getRNG().nextFloat() < 0.05F)) {
|
|
|
|
this.lastX = entitylivingbase.posX;
|
|
this.lastY = entitylivingbase.boundingBox.minY;
|
|
this.lastZ = entitylivingbase.posZ;
|
|
this.pathTimer = failedPathFindingPenalty + 4 + this.attacker.getRNG().nextInt(7);
|
|
|
|
if(this.attacker.getNavigator().getPath() != null) {
|
|
|
|
PathPoint finalPathPoint = this.attacker.getNavigator().getPath().getFinalPathPoint();
|
|
if(finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1) {
|
|
failedPathFindingPenalty = 0;
|
|
|
|
} else {
|
|
failedPathFindingPenalty += 10;
|
|
}
|
|
|
|
} else {
|
|
failedPathFindingPenalty += 10;
|
|
}
|
|
|
|
if(d0 > 1024.0D) {
|
|
this.pathTimer += 10;
|
|
} else if(d0 > 256.0D) {
|
|
this.pathTimer += 5;
|
|
}
|
|
|
|
double[] pos = getApproachPos();
|
|
if(!this.attacker.getNavigator().tryMoveToXYZ(pos[0], pos[1], pos[2], speedTowardsTarget)) {
|
|
this.pathTimer += 15;
|
|
}
|
|
}
|
|
|
|
this.attackTick = Math.max(this.attackTick - 1, 0);
|
|
|
|
/*if(d0 <= d1 && this.attackTick <= 20) {
|
|
this.attackTick = 20;
|
|
|
|
if(this.attacker.getHeldItem() != null) {
|
|
this.attacker.swingItem();
|
|
}
|
|
|
|
this.attacker.attackEntityAsMob(entitylivingbase);
|
|
}*/
|
|
}
|
|
|
|
public double[] getApproachPos() {
|
|
|
|
EntityLivingBase target = this.attacker.getAttackTarget();
|
|
|
|
Vec3 vec = Vec3.createVectorHelper(this.attacker.posX - target.posX, this.attacker.posY - target.posY, this.attacker.posZ - target.posZ);
|
|
|
|
double range = Math.min(vec.lengthVector(), 20) - 10;
|
|
|
|
vec = vec.normalize();
|
|
|
|
double x = this.attacker.posX + vec.xCoord * range + this.attacker.getRNG().nextGaussian() * 2;
|
|
double y = this.attacker.posY + vec.yCoord - 5 + this.attacker.getRNG().nextInt(11);
|
|
double z = this.attacker.posZ + vec.zCoord * range + this.attacker.getRNG().nextGaussian() * 2;
|
|
|
|
return new double[] {x, y, z};
|
|
}
|
|
}
|