From 16594a278af64358c8727d699c714efc476fb659 Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 26 Jul 2016 00:32:32 +0800 Subject: [PATCH] Implement new pathfinding APIs --- .../nms/v1_10_R1/util/NMSImpl.java | 47 +++++++++++++++++++ .../npc/ai/AStarNavigationStrategy.java | 7 +++ .../npc/ai/AbstractPathStrategy.java | 32 ------------- .../npc/ai/CitizensNavigator.java | 6 +++ .../npc/ai/FlyingAStarNavigationStrategy.java | 7 +++ .../npc/ai/MCNavigationStrategy.java | 9 ++++ .../citizensnpcs/npc/ai/MCTargetStrategy.java | 15 ++++++ .../net/citizensnpcs/npc/ai/PathStrategy.java | 20 -------- 8 files changed, 91 insertions(+), 52 deletions(-) delete mode 100644 src/main/java/net/citizensnpcs/npc/ai/AbstractPathStrategy.java delete mode 100644 src/main/java/net/citizensnpcs/npc/ai/PathStrategy.java diff --git a/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index c0f5eec94..ef5f94952 100644 --- a/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -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 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 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 { + private final NavigationAbstract navigation; + + public NavigationIterable(NavigationAbstract nav) { + this.navigation = nav; + } + + @Override + public Iterator iterator() { + final int npoints = navigation.k() == null ? 0 : navigation.k().d(); + return new Iterator() { + 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; diff --git a/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java index 517b80bf4..d17892c4b 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java @@ -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 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 ASTAR = AStarMachine.createWithDefaultStorage(); + private static final Location NPC_LOCATION = new Location(null, 0, 0, 0); } diff --git a/src/main/java/net/citizensnpcs/npc/ai/AbstractPathStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/AbstractPathStrategy.java deleted file mode 100644 index 5058d1aa8..000000000 --- a/src/main/java/net/citizensnpcs/npc/ai/AbstractPathStrategy.java +++ /dev/null @@ -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; - } -} \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/npc/ai/CitizensNavigator.java b/src/main/java/net/citizensnpcs/npc/ai/CitizensNavigator.java index 2d0610119..e38151593 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/CitizensNavigator.java +++ b/src/main/java/net/citizensnpcs/npc/ai/CitizensNavigator.java @@ -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; diff --git a/src/main/java/net/citizensnpcs/npc/ai/FlyingAStarNavigationStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/FlyingAStarNavigationStrategy.java index a6166f0b0..2d51be62e 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/FlyingAStarNavigationStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/FlyingAStarNavigationStrategy.java @@ -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 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 ASTAR = AStarMachine.createWithDefaultStorage(); + private static final Location NPC_LOCATION = new Location(null, 0, 0, 0); } diff --git a/src/main/java/net/citizensnpcs/npc/ai/MCNavigationStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/MCNavigationStrategy.java index fed0aca75..0a90b0f97 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/MCNavigationStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/MCNavigationStrategy.java @@ -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 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 getPath(); + void stop(); boolean update(); diff --git a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java index 4b863ee52..8673a3cab 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java @@ -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 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 getPath() { + return strategy.getPath(); + } + @Override public void setPath() { setStrategy(); @@ -174,6 +186,8 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget { } public static interface TargetNavigator { + Iterable 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); } diff --git a/src/main/java/net/citizensnpcs/npc/ai/PathStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/PathStrategy.java deleted file mode 100644 index 448612a8a..000000000 --- a/src/main/java/net/citizensnpcs/npc/ai/PathStrategy.java +++ /dev/null @@ -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(); -} \ No newline at end of file