diff --git a/src/main/java/org/terasology/minion/move/FindPathToNode.java b/src/main/java/org/terasology/minion/move/FindPathToNode.java index a340753e..43e58931 100644 --- a/src/main/java/org/terasology/minion/move/FindPathToNode.java +++ b/src/main/java/org/terasology/minion/move/FindPathToNode.java @@ -15,7 +15,10 @@ */ package org.terasology.minion.move; -import com.google.gson.annotations.Expose; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.util.concurrent.SettableFuture; import org.terasology.logic.behavior.BehaviorAction; import org.terasology.logic.behavior.core.Actor; import org.terasology.logic.behavior.core.BaseAction; @@ -29,6 +32,7 @@ import org.terasology.registry.In; import java.util.Arrays; +import java.util.List; /** * Requests a path to a target defined using the MinionMoveComponent.target.
@@ -58,6 +62,8 @@ public void construct(final Actor actor) { if(pathfinderSystem==null){setup();} final MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); Vector3f targetLocation = moveComponent.target; + moveComponent.path = null; + actor.save(moveComponent); WalkableBlock currentBlock = moveComponent.currentBlock; if (currentBlock == null || targetLocation == null) { moveComponent.path = Path.INVALID; @@ -68,21 +74,26 @@ public void construct(final Actor actor) { moveComponent.path = Path.INVALID; return; } - pathfinderSystem.requestPath( + SettableFuture> pathFuture = pathfinderSystem.requestPath( actor.getEntity(), currentBlock.getBlockPosition(), Arrays.asList(workTarget.getBlockPosition())); - /*, new PathfinderSystem.PathReadyCallback() { - @Override - public void pathReady(int pathId, List path, WalkableBlock target, List start) { - if (path == null) { + Futures.addCallback(pathFuture, new FutureCallback>() { + @Override + public void onSuccess(List paths) { + if (paths == null) { moveComponent.path = Path.INVALID; - } else if (path.size() > 0) { - moveComponent.path = path.get(0); + } else if (paths.size() > 0) { + moveComponent.path = paths.get(0); } actor.save(moveComponent); } - });*/ + + @Override + public void onFailure(Throwable t) { + moveComponent.path = Path.INVALID; + } + }); } @Override diff --git a/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java b/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java index 3a951245..58678709 100644 --- a/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java +++ b/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java @@ -26,6 +26,7 @@ import org.terasology.navgraph.WalkableBlock; import org.terasology.pathfinding.componentSystem.PathRenderSystem; import org.terasology.pathfinding.model.Path; +import org.terasology.registry.CoreRegistry; import org.terasology.registry.In; /** @@ -40,11 +41,14 @@ public class MoveAlongPathNode extends BaseAction { private static final Logger logger = LoggerFactory.getLogger(MoveAlongPathNode.class); - @In + // @In private transient PathRenderSystem pathRenderSystem; @Override public void construct(Actor actor) { + // TODO: Temporary fix for injection malfunction in actions, ideally remove this in the future. + pathRenderSystem = CoreRegistry.get(PathRenderSystem.class); + MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); if (moveComponent != null && moveComponent.path != null && moveComponent.path != Path.INVALID) { pathRenderSystem.addPath(moveComponent.path);