-
Notifications
You must be signed in to change notification settings - Fork 497
/
RobotAIMoveTo.java
executable file
·99 lines (83 loc) · 2.35 KB
/
RobotAIMoveTo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.robots;
import java.util.LinkedList;
import net.minecraft.nbt.NBTTagCompound;
import buildcraft.core.BlockIndex;
import buildcraft.core.utils.PathFinding;
public class RobotAIMoveTo extends RobotAIBase {
private PathFinding pathSearch;
private LinkedList<BlockIndex> path;
private double prevDistance = Double.MAX_VALUE;
private float dx, dy, dz;
public RobotAIMoveTo (EntityRobot robot, float x, float y, float z) {
super(robot);
dx = x;
dy = y;
dz = z;
}
public RobotAIMoveTo(EntityRobot robot, LinkedList<BlockIndex> iPath) {
super(robot);
path = iPath;
dx = path.getLast().x;
dy = path.getLast().y;
dz = path.getLast().z;
setNextInPath();
}
@Override
public void updateTask() {
super.updateTask();
if (path != null) {
double distance = robot.getDistance(destX, destY, destZ);
if (!robot.isMoving() || distance > prevDistance) {
if (path.size() > 0) {
path.removeFirst();
}
setNextInPath();
} else {
prevDistance = robot.getDistance(destX, destY, destZ);
}
if (path.size() == 0) {
robot.motionX = 0;
robot.motionY = 0;
robot.motionZ = 0;
}
} else if (pathSearch == null) {
pathSearch = new PathFinding
(robot.worldObj,
new BlockIndex((int) Math.floor(robot.posX), (int) Math.floor(robot.posY),
(int) Math.floor(robot.posZ)),
new BlockIndex((int) Math.floor(dx), (int) Math.floor(dy), (int) Math.floor(dz)));
} else if (!pathSearch.isDone()) {
path = pathSearch.getResult();
setNextInPath();
} else {
pathSearch.iterate(PathFinding.PATH_ITERATIONS);
}
}
private void setNextInPath() {
if (path.size() > 0) {
BlockIndex next = path.getFirst();
setDestination(robot, next.x + 0.5F, next.y + 0.5F, next.z + 0.5F);
prevDistance = Double.MAX_VALUE;
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
}
@Override
public boolean isDone() {
return path != null && path.size() == 0;
}
}