-
Notifications
You must be signed in to change notification settings - Fork 497
/
AIRobotGotoBlock.java
executable file
·108 lines (92 loc) · 2.59 KB
/
AIRobotGotoBlock.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
100
101
102
103
104
105
106
107
108
/**
* 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 buildcraft.api.core.BlockIndex;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.core.utils.PathFinding;
import buildcraft.core.utils.PathFindingJob;
public class AIRobotGotoBlock extends AIRobotGoto {
private PathFinding pathSearch;
private PathFindingJob pathSearchJob;
private LinkedList<BlockIndex> path;
private double prevDistance = Double.MAX_VALUE;
private float finalX, finalY, finalZ;
public AIRobotGotoBlock(EntityRobotBase robot, int x, int y, int z) {
super(robot);
finalX = x;
finalY = y;
finalZ = z;
}
public AIRobotGotoBlock(EntityRobotBase robot, LinkedList<BlockIndex> iPath) {
super(robot);
path = iPath;
finalX = path.getLast().x;
finalY = path.getLast().y;
finalZ = path.getLast().z;
setNextInPath();
}
@Override
public void start() {
robot.undock();
if (path == 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(finalX), (int) Math.floor(finalY), (int) Math.floor(finalZ)));
pathSearchJob = new PathFindingJob(pathSearch);
pathSearchJob.start();
}
}
@Override
public void update() {
if (path != null) {
double distance = robot.getDistance(nextX, nextY, nextZ);
if (!robot.isMoving() || distance > prevDistance) {
if (path.size() > 0) {
path.removeFirst();
}
setNextInPath();
} else {
prevDistance = robot.getDistance(nextX, nextY, nextZ);
}
} else {
if (!pathSearchJob.isAlive()) {
if (pathSearch.isDone()) {
path = pathSearch.getResult();
setNextInPath();
}
}
}
if (path != null && path.size() == 0) {
robot.motionX = 0;
robot.motionY = 0;
robot.motionZ = 0;
robot.posX = finalX + 0.5F;
robot.posY = finalY + 0.5F;
robot.posZ = finalZ + 0.5F;
terminate();
}
}
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 end() {
if (pathSearchJob != null) {
pathSearchJob.terminate();
robot.motionX = 0;
robot.motionY = 0;
robot.motionZ = 0;
}
}
}