progress with robot AI and fixed pathfinding, #1732
This commit is contained in:
parent
79ddf23192
commit
5060da651f
6 changed files with 93 additions and 26 deletions
common/buildcraft/core
|
@ -71,7 +71,7 @@ public class EntityRobotPicker extends EntityRobot implements IInventory {
|
||||||
hideLaser();
|
hideLaser();
|
||||||
scan ();
|
scan ();
|
||||||
} else if (pickTime == -1) {
|
} else if (pickTime == -1) {
|
||||||
if (getDistance(target.posX, target.posY, target.posZ) < 1) {
|
if (currentAI.isDone()) {
|
||||||
setLaserDestination((float) target.posX, (float) target.posY, (float) target.posZ);
|
setLaserDestination((float) target.posX, (float) target.posY, (float) target.posZ);
|
||||||
showLaser();
|
showLaser();
|
||||||
pickTracker = new SafeTimeTracker (200);
|
pickTracker = new SafeTimeTracker (200);
|
||||||
|
|
|
@ -65,4 +65,8 @@ public class RobotAIBase extends EntityAIBase {
|
||||||
public boolean shouldExecute() {
|
public boolean shouldExecute() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDone() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
49
common/buildcraft/core/robots/RobotAIComposite.java
Executable file
49
common/buildcraft/core/robots/RobotAIComposite.java
Executable file
|
@ -0,0 +1,49 @@
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
public class RobotAIComposite extends RobotAIBase {
|
||||||
|
|
||||||
|
LinkedList<RobotAIBase> cpts = new LinkedList<RobotAIBase>();
|
||||||
|
|
||||||
|
public RobotAIComposite(EntityRobot iRobot, RobotAIBase... icpts) {
|
||||||
|
super(iRobot);
|
||||||
|
|
||||||
|
for (RobotAIBase ai : icpts) {
|
||||||
|
cpts.add(ai);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTask() {
|
||||||
|
if (cpts.size() > 0) {
|
||||||
|
if (cpts.getFirst().isDone()) {
|
||||||
|
cpts.removeFirst();
|
||||||
|
} else {
|
||||||
|
cpts.getFirst().updateTask();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldExecute() {
|
||||||
|
if (cpts.size() > 0) {
|
||||||
|
return cpts.getFirst().shouldExecute();
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDone() {
|
||||||
|
return cpts.size() == 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,35 +22,45 @@ public class RobotAIMoveTo extends RobotAIBase {
|
||||||
private PathFinding pathSearch;
|
private PathFinding pathSearch;
|
||||||
private LinkedList<BlockIndex> path;
|
private LinkedList<BlockIndex> path;
|
||||||
private double prevDistance = Double.MAX_VALUE;
|
private double prevDistance = Double.MAX_VALUE;
|
||||||
|
private float dx, dy, dz;
|
||||||
public RobotAIMoveTo(EntityRobot robot) {
|
|
||||||
super(robot);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RobotAIMoveTo (EntityRobot robot, float x, float y, float z) {
|
public RobotAIMoveTo (EntityRobot robot, float x, float y, float z) {
|
||||||
super(robot);
|
super(robot);
|
||||||
|
dx = x;
|
||||||
pathSearch = new PathFinding
|
dy = y;
|
||||||
(robot.worldObj,
|
dz = z;
|
||||||
new BlockIndex((int) Math.floor(robot.posX), (int) Math.floor(robot.posY),
|
|
||||||
(int) Math.floor(robot.posZ)),
|
|
||||||
new BlockIndex((int) Math.floor(x), (int) Math.floor(y), (int) Math.floor(z)));
|
|
||||||
|
|
||||||
pathSearch.iterate(PATH_ITERATIONS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTask() {
|
public void updateTask() {
|
||||||
super.updateTask();
|
super.updateTask();
|
||||||
|
|
||||||
if (path != null) {
|
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)));
|
||||||
|
|
||||||
|
pathSearch.iterate(PATH_ITERATIONS);
|
||||||
|
} else if (path != null) {
|
||||||
double distance = robot.getDistance(destX, destY, destZ);
|
double distance = robot.getDistance(destX, destY, destZ);
|
||||||
|
|
||||||
if (distance > prevDistance) {
|
if (distance > prevDistance) {
|
||||||
|
if (path.size() > 0) {
|
||||||
|
path.removeFirst();
|
||||||
|
}
|
||||||
|
|
||||||
setNextInPath();
|
setNextInPath();
|
||||||
} else {
|
} else {
|
||||||
prevDistance = robot.getDistance(destX, destY, destZ);
|
prevDistance = robot.getDistance(destX, destY, destZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (path.size() == 0) {
|
||||||
|
robot.motionX = 0;
|
||||||
|
robot.motionY = 0;
|
||||||
|
robot.motionZ = 0;
|
||||||
|
}
|
||||||
} else if (!pathSearch.isDone()) {
|
} else if (!pathSearch.isDone()) {
|
||||||
pathSearch.iterate(PATH_ITERATIONS);
|
pathSearch.iterate(PATH_ITERATIONS);
|
||||||
} else {
|
} else {
|
||||||
|
@ -61,7 +71,7 @@ public class RobotAIMoveTo extends RobotAIBase {
|
||||||
|
|
||||||
private void setNextInPath() {
|
private void setNextInPath() {
|
||||||
if (path.size() > 0) {
|
if (path.size() > 0) {
|
||||||
BlockIndex next = path.removeFirst();
|
BlockIndex next = path.getFirst();
|
||||||
setDestination(robot, next.x + 0.5F, next.y + 0.5F, next.z + 0.5F);
|
setDestination(robot, next.x + 0.5F, next.y + 0.5F, next.z + 0.5F);
|
||||||
prevDistance = Double.MAX_VALUE;
|
prevDistance = Double.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -76,4 +86,9 @@ public class RobotAIMoveTo extends RobotAIBase {
|
||||||
public void readFromNBT(NBTTagCompound nbt) {
|
public void readFromNBT(NBTTagCompound nbt) {
|
||||||
super.readFromNBT(nbt);
|
super.readFromNBT(nbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDone() {
|
||||||
|
return path != null && path.size() == 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,19 +8,22 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.core.robots;
|
package buildcraft.core.robots;
|
||||||
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
|
|
||||||
public class RobotAIReturnToDock extends RobotAIBase {
|
public class RobotAIReturnToDock extends RobotAIComposite {
|
||||||
|
|
||||||
double prevDistance = Double.MAX_VALUE;
|
double prevDistance = Double.MAX_VALUE;
|
||||||
|
|
||||||
int phase = 0;
|
int phase = 0;
|
||||||
|
|
||||||
public RobotAIReturnToDock(EntityRobot iRobot) {
|
public RobotAIReturnToDock(EntityRobot iRobot) {
|
||||||
super(iRobot);
|
super(iRobot,
|
||||||
|
new RobotAIMoveTo(iRobot,
|
||||||
|
iRobot.dockingStation.x + iRobot.dockingStation.side.offsetX * 2,
|
||||||
|
iRobot.dockingStation.y + 0.5F + iRobot.dockingStation.side.offsetY * 1.5F,
|
||||||
|
iRobot.dockingStation.z + 0.5F + iRobot.dockingStation.side.offsetZ * 1.5F));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/*@Override
|
||||||
public void updateTask() {
|
public void updateTask() {
|
||||||
super.updateTask();
|
super.updateTask();
|
||||||
|
|
||||||
|
@ -77,5 +80,5 @@ public class RobotAIReturnToDock extends RobotAIBase {
|
||||||
super.readFromNBT(nbt);
|
super.readFromNBT(nbt);
|
||||||
|
|
||||||
phase = nbt.getInteger("phase");
|
phase = nbt.getInteger("phase");
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,13 +129,9 @@ public class PathFinding {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Node bestMatch = findSmallerWeight(nodes);
|
nodes.addAll(openList.values());
|
||||||
|
|
||||||
if (bestMatch == null) {
|
return findSmallerWeight(nodes);
|
||||||
bestMatch = findSmallerWeight(openList.values());
|
|
||||||
}
|
|
||||||
|
|
||||||
return bestMatch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node findSmallerWeight(Collection<Node> collection) {
|
private Node findSmallerWeight(Collection<Node> collection) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue