forked from TAIGA/TAIGA
99 lines
3.4 KiB
Java
99 lines
3.4 KiB
Java
package com.sosnitzka.taiga.util;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.state.IBlockState;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityCreature;
|
|
import net.minecraft.entity.ai.EntityAIBase;
|
|
import net.minecraft.entity.ai.RandomPositionGenerator;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.Vec3d;
|
|
import net.minecraft.world.World;
|
|
|
|
public class EntityAIPermanentPanic extends EntityAIBase {
|
|
private EntityCreature theEntityCreature;
|
|
private double speed;
|
|
private double randPosX;
|
|
private double randPosY;
|
|
private double randPosZ;
|
|
|
|
public EntityAIPermanentPanic(EntityCreature creature, double speedIn) {
|
|
this.theEntityCreature = creature;
|
|
this.speed = speedIn;
|
|
}
|
|
|
|
/**
|
|
* Returns whether the EntityAIBase should begin execution.
|
|
*/
|
|
public boolean shouldExecute() {
|
|
|
|
Vec3d vec3d = RandomPositionGenerator.findRandomTarget(this.theEntityCreature, 5, 4);
|
|
|
|
if (vec3d == null) {
|
|
return false;
|
|
} else {
|
|
this.randPosX = vec3d.x;
|
|
this.randPosY = vec3d.y;
|
|
this.randPosZ = vec3d.z;
|
|
|
|
if (this.theEntityCreature.isBurning()) {
|
|
BlockPos blockpos = this.getRandPos(this.theEntityCreature.world, this.theEntityCreature, 5, 4);
|
|
|
|
if (blockpos != null) {
|
|
this.randPosX = (double) blockpos.getX();
|
|
this.randPosY = (double) blockpos.getY();
|
|
this.randPosZ = (double) blockpos.getZ();
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Execute a one shot task or start executing a continuous task
|
|
*/
|
|
public void startExecuting() {
|
|
this.theEntityCreature.getNavigator().tryMoveToXYZ(this.randPosX, this.randPosY, this.randPosZ, this.speed);
|
|
}
|
|
|
|
/**
|
|
* Returns whether an in-progress EntityAIBase should continue executing
|
|
*/
|
|
public boolean continueExecuting() {
|
|
return !this.theEntityCreature.getNavigator().noPath();
|
|
}
|
|
|
|
private BlockPos getRandPos(World worldIn, Entity entityIn, int horizontalRange, int verticalRange) {
|
|
BlockPos blockpos = new BlockPos(entityIn);
|
|
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
|
|
int i = blockpos.getX();
|
|
int j = blockpos.getY();
|
|
int k = blockpos.getZ();
|
|
float f = (float) (horizontalRange * horizontalRange * verticalRange * 2);
|
|
BlockPos blockpos1 = null;
|
|
|
|
for (int l = i - horizontalRange; l <= i + horizontalRange; ++l) {
|
|
for (int i1 = j - verticalRange; i1 <= j + verticalRange; ++i1) {
|
|
for (int j1 = k - horizontalRange; j1 <= k + horizontalRange; ++j1) {
|
|
blockpos$mutableblockpos.setPos(l, i1, j1);
|
|
IBlockState iblockstate = worldIn.getBlockState(blockpos$mutableblockpos);
|
|
Block block = iblockstate.getBlock();
|
|
|
|
if (block == Blocks.WATER || block == Blocks.FLOWING_WATER) {
|
|
float f1 = (float) ((l - i) * (l - i) + (i1 - j) * (i1 - j) + (j1 - k) * (j1 - k));
|
|
|
|
if (f1 < f) {
|
|
f = f1;
|
|
blockpos1 = new BlockPos(blockpos$mutableblockpos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return blockpos1;
|
|
}
|
|
} |