package joshie.harvest.api.npc.task; import joshie.harvest.api.npc.NPCEntity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.ai.RandomPositionGenerator; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.pathfinding.Path; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import javax.annotation.Nullable; @HFTask("move") public class TaskMove extends TaskElement { private BlockPos pos; private TaskMove(BlockPos pos) { this.pos = pos; } public static TaskMove of(BlockPos pos) { return new TaskMove(pos); } public TaskElement offset(EnumFacing facing, int amount) { return TaskMove.of(pos.offset(facing, amount)); } @Nullable private Path getPathToTarget(EntityAgeable npc) { Path path = npc.getNavigator().getPathToPos(pos); if (path != null) return path; else { //Grab a random block towards the target Vec3d vec = RandomPositionGenerator.findRandomTargetBlockTowards(npc, 10, 7, new Vec3d((double) pos.getX() + 0.5D, (double) pos.getY() + 1D, (double) pos.getZ() + 0.5D)); if (vec != null) { return npc.getNavigator().getPathToPos(new BlockPos(vec)); } else return null; } } @Override public void execute(NPCEntity npc) { Path path = getPathToTarget(npc.getAsEntity()); if (path != null) { npc.getAsEntity().getNavigator().setPath(path, 0.6F); } } @Override public boolean isSatisfied(NPCEntity npc) { return npc.getAsEntity().getDistanceSq(pos) <= 1D; } @Override public void readFromNBT(NBTTagCompound tag) { pos = BlockPos.fromLong(tag.getLong("Pos")); } @Override public NBTTagCompound writeToNBT(NBTTagCompound tag) { tag.setLong("Pos", pos.toLong()); return tag; } }