diff --git a/src/main/java/net/citizensnpcs/api/ai/goals/FollowPathGoal.java b/src/main/java/net/citizensnpcs/api/ai/goals/FollowPathGoal.java new file mode 100644 index 00000000..4be1e342 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/ai/goals/FollowPathGoal.java @@ -0,0 +1,67 @@ +package net.citizensnpcs.api.ai.goals; + +import java.util.List; +import java.util.stream.Collectors; + +import org.bukkit.Location; + +import net.citizensnpcs.api.ai.Goal; +import net.citizensnpcs.api.ai.tree.Behavior; +import net.citizensnpcs.api.ai.tree.BehaviorGoalAdapter; +import net.citizensnpcs.api.ai.tree.BehaviorStatus; +import net.citizensnpcs.api.npc.NPC; + +/** + * A sample {@link Goal}/{@link Behavior} that simply moves an {@link NPC} through a list of {@link Location}s. + */ +public class FollowPathGoal extends BehaviorGoalAdapter { + private int idx; + private final NPC npc; + private final List path; + + public FollowPathGoal(NPC npc, List path) { + this.npc = npc; + this.path = path; + } + + @Override + public void reset() { + npc.getNavigator().cancelNavigation(); + idx = 0; + } + + @Override + public BehaviorStatus run() { + if (idx >= path.size()) { + return BehaviorStatus.SUCCESS; + } + if (!npc.getNavigator().isNavigating()) { + setPath(); + } + BehaviorStatus status = path.get(idx).run(); + if (status == BehaviorStatus.SUCCESS) { + idx++; + setPath(); + } + return status; + } + + private void setPath() { + if (idx >= path.size()) + return; + path.get(idx).shouldExecute(); + } + + @Override + public boolean shouldExecute() { + return !npc.getNavigator().isNavigating() && path != null; + } + + public static FollowPathGoal create(NPC npc, List path) { + return new FollowPathGoal(npc, path); + } + + public static FollowPathGoal createFromLocations(NPC npc, List path) { + return new FollowPathGoal(npc, path.stream().map(loc -> new MoveToGoal(npc, loc)).collect(Collectors.toList())); + } +} diff --git a/src/main/java/net/citizensnpcs/api/ai/goals/MoveToGoal.java b/src/main/java/net/citizensnpcs/api/ai/goals/MoveToGoal.java index bc2f99fe..55227319 100644 --- a/src/main/java/net/citizensnpcs/api/ai/goals/MoveToGoal.java +++ b/src/main/java/net/citizensnpcs/api/ai/goals/MoveToGoal.java @@ -4,7 +4,6 @@ import net.citizensnpcs.api.ai.Goal; import net.citizensnpcs.api.ai.event.CancelReason; -import net.citizensnpcs.api.ai.event.NavigatorCallback; import net.citizensnpcs.api.ai.tree.Behavior; import net.citizensnpcs.api.ai.tree.BehaviorGoalAdapter; import net.citizensnpcs.api.ai.tree.BehaviorStatus; @@ -44,12 +43,9 @@ public boolean shouldExecute() { boolean executing = !npc.getNavigator().isNavigating() && target != null; if (executing) { npc.getNavigator().setTarget(target); - npc.getNavigator().getLocalParameters().addSingleUseCallback(new NavigatorCallback() { - @Override - public void onCompletion(CancelReason cancelReason) { - finished = true; - reason = cancelReason; - } + npc.getNavigator().getLocalParameters().addSingleUseCallback(cancelReason -> { + finished = true; + reason = cancelReason; }); } return executing;