mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-09-28 23:27:40 +02:00
Implement new pathfinding APIs
This commit is contained in:
parent
fa3fbe7be1
commit
16594a278a
@ -7,6 +7,7 @@ import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
@ -38,6 +39,7 @@ import org.bukkit.entity.Wither;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.bukkit.plugin.PluginLoadOrder;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Preconditions;
|
||||
@ -175,6 +177,7 @@ import net.minecraft.server.v1_10_R1.NetworkManager;
|
||||
import net.minecraft.server.v1_10_R1.Packet;
|
||||
import net.minecraft.server.v1_10_R1.PacketPlayOutEntityTeleport;
|
||||
import net.minecraft.server.v1_10_R1.PacketPlayOutPlayerInfo;
|
||||
import net.minecraft.server.v1_10_R1.PathPoint;
|
||||
import net.minecraft.server.v1_10_R1.PathfinderGoalSelector;
|
||||
import net.minecraft.server.v1_10_R1.ReportedException;
|
||||
import net.minecraft.server.v1_10_R1.SoundEffect;
|
||||
@ -405,6 +408,11 @@ public class NMSImpl implements NMSBridge {
|
||||
return reason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return new NavigationIterable(navigation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
stopNavigation(navigation);
|
||||
@ -887,6 +895,11 @@ public class NMSImpl implements NMSBridge {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return new NavigationIterable(navigation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPath() {
|
||||
Location location = parameters.entityTargetLocationMapper().apply(target);
|
||||
@ -912,6 +925,40 @@ public class NMSImpl implements NMSBridge {
|
||||
private static final Location HANDLE_LOCATION = new Location(null, 0, 0, 0);
|
||||
}
|
||||
|
||||
private static class NavigationIterable implements Iterable<Vector> {
|
||||
private final NavigationAbstract navigation;
|
||||
|
||||
public NavigationIterable(NavigationAbstract nav) {
|
||||
this.navigation = nav;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Vector> iterator() {
|
||||
final int npoints = navigation.k() == null ? 0 : navigation.k().d();
|
||||
return new Iterator<Vector>() {
|
||||
PathPoint curr = npoints > 0 ? navigation.k().a(0) : null;
|
||||
int i = 0;
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return curr != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector next() {
|
||||
PathPoint old = curr;
|
||||
curr = i + 1 < npoints ? navigation.k().a(++i) : null;
|
||||
return new Vector(old.a, old.b, old.c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static void clearGoals(PathfinderGoalSelector... goalSelectors) {
|
||||
if (GOAL_FIELD == null || goalSelectors == null)
|
||||
return;
|
||||
|
@ -5,6 +5,7 @@ import org.bukkit.Location;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import net.citizensnpcs.Settings.Setting;
|
||||
import net.citizensnpcs.api.ai.AbstractPathStrategy;
|
||||
import net.citizensnpcs.api.ai.NavigatorParameters;
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
@ -43,6 +44,11 @@ public class AStarNavigationStrategy extends AbstractPathStrategy {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return plan == null ? null : plan.getPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getTargetAsLocation() {
|
||||
return destination;
|
||||
@ -89,5 +95,6 @@ public class AStarNavigationStrategy extends AbstractPathStrategy {
|
||||
}
|
||||
|
||||
private static final AStarMachine<VectorNode, Path> ASTAR = AStarMachine.createWithDefaultStorage();
|
||||
|
||||
private static final Location NPC_LOCATION = new Location(null, 0, 0, 0);
|
||||
}
|
||||
|
@ -1,32 +0,0 @@
|
||||
package net.citizensnpcs.npc.ai;
|
||||
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
|
||||
public abstract class AbstractPathStrategy implements PathStrategy {
|
||||
private CancelReason cancelReason;
|
||||
private final TargetType type;
|
||||
|
||||
protected AbstractPathStrategy(TargetType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearCancelReason() {
|
||||
cancelReason = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CancelReason getCancelReason() {
|
||||
return cancelReason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetType getTargetType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
protected void setCancelReason(CancelReason reason) {
|
||||
cancelReason = reason;
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ import net.citizensnpcs.Settings.Setting;
|
||||
import net.citizensnpcs.api.ai.EntityTarget;
|
||||
import net.citizensnpcs.api.ai.Navigator;
|
||||
import net.citizensnpcs.api.ai.NavigatorParameters;
|
||||
import net.citizensnpcs.api.ai.PathStrategy;
|
||||
import net.citizensnpcs.api.ai.StuckAction;
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.TeleportStuckAction;
|
||||
@ -86,6 +87,11 @@ public class CitizensNavigator implements Navigator, Runnable {
|
||||
return npc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PathStrategy getPathStrategy() {
|
||||
return executing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getTargetAsLocation() {
|
||||
return isNavigating() ? executing.getTargetAsLocation() : null;
|
||||
|
@ -6,6 +6,7 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import net.citizensnpcs.Settings.Setting;
|
||||
import net.citizensnpcs.api.ai.AbstractPathStrategy;
|
||||
import net.citizensnpcs.api.ai.NavigatorParameters;
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
@ -56,6 +57,11 @@ public class FlyingAStarNavigationStrategy extends AbstractPathStrategy {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return plan == null ? null : plan.getPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getTargetAsLocation() {
|
||||
return target;
|
||||
@ -118,5 +124,6 @@ public class FlyingAStarNavigationStrategy extends AbstractPathStrategy {
|
||||
}
|
||||
|
||||
private static final AStarMachine<VectorNode, Path> ASTAR = AStarMachine.createWithDefaultStorage();
|
||||
|
||||
private static final Location NPC_LOCATION = new Location(null, 0, 0, 0);
|
||||
}
|
||||
|
@ -2,7 +2,9 @@ package net.citizensnpcs.npc.ai;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import net.citizensnpcs.api.ai.AbstractPathStrategy;
|
||||
import net.citizensnpcs.api.ai.NavigatorParameters;
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
@ -27,6 +29,11 @@ public class MCNavigationStrategy extends AbstractPathStrategy {
|
||||
return handle.getLocation(HANDLE_LOCATION).distanceSquared(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return navigator.getPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getTargetAsLocation() {
|
||||
return target;
|
||||
@ -66,6 +73,8 @@ public class MCNavigationStrategy extends AbstractPathStrategy {
|
||||
public static interface MCNavigator {
|
||||
CancelReason getCancelReason();
|
||||
|
||||
Iterable<Vector> getPath();
|
||||
|
||||
void stop();
|
||||
|
||||
boolean update();
|
||||
|
@ -3,10 +3,12 @@ package net.citizensnpcs.npc.ai;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import net.citizensnpcs.api.ai.AttackStrategy;
|
||||
import net.citizensnpcs.api.ai.EntityTarget;
|
||||
import net.citizensnpcs.api.ai.NavigatorParameters;
|
||||
import net.citizensnpcs.api.ai.PathStrategy;
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
import net.citizensnpcs.api.npc.NPC;
|
||||
@ -58,6 +60,11 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
|
||||
return cancelReason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return targetNavigator.getPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public org.bukkit.entity.Entity getTarget() {
|
||||
return target;
|
||||
@ -138,6 +145,11 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
|
||||
setStrategy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector> getPath() {
|
||||
return strategy.getPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPath() {
|
||||
setStrategy();
|
||||
@ -174,6 +186,8 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
|
||||
}
|
||||
|
||||
public static interface TargetNavigator {
|
||||
Iterable<Vector> getPath();
|
||||
|
||||
void setPath();
|
||||
|
||||
void stop();
|
||||
@ -189,5 +203,6 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
|
||||
}
|
||||
};
|
||||
private static final Location HANDLE_LOCATION = new Location(null, 0, 0, 0);
|
||||
|
||||
private static final Location TARGET_LOCATION = new Location(null, 0, 0, 0);
|
||||
}
|
||||
|
@ -1,20 +0,0 @@
|
||||
package net.citizensnpcs.npc.ai;
|
||||
|
||||
import net.citizensnpcs.api.ai.TargetType;
|
||||
import net.citizensnpcs.api.ai.event.CancelReason;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
public interface PathStrategy {
|
||||
void clearCancelReason();
|
||||
|
||||
CancelReason getCancelReason();
|
||||
|
||||
Location getTargetAsLocation();
|
||||
|
||||
TargetType getTargetType();
|
||||
|
||||
void stop();
|
||||
|
||||
boolean update();
|
||||
}
|
Loading…
Reference in New Issue
Block a user