Implement new pathfinding APIs

This commit is contained in:
fullwall 2016-07-26 00:32:32 +08:00
parent fa3fbe7be1
commit 16594a278a
8 changed files with 91 additions and 52 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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();

View File

@ -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);
}

View File

@ -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();
}