Skip to content

Commit

Permalink
Add a simple path following goal
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jun 25, 2023
1 parent 0f2326e commit be146e1
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 7 deletions.
67 changes: 67 additions & 0 deletions 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<MoveToGoal> path;

public FollowPathGoal(NPC npc, List<MoveToGoal> 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<MoveToGoal> path) {
return new FollowPathGoal(npc, path);
}

public static FollowPathGoal createFromLocations(NPC npc, List<Location> path) {
return new FollowPathGoal(npc, path.stream().map(loc -> new MoveToGoal(npc, loc)).collect(Collectors.toList()));
}
}
10 changes: 3 additions & 7 deletions src/main/java/net/citizensnpcs/api/ai/goals/MoveToGoal.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit be146e1

Please sign in to comment.