From a7a6b54d39a1bbb833d3054f9cf0f009c51bd5c2 Mon Sep 17 00:00:00 2001 From: fullwall Date: Mon, 21 Oct 2013 00:13:03 +0800 Subject: [PATCH] Remove waypoint provider goal when providers change --- .../trait/waypoint/GuidedWaypointProvider.java | 5 +++++ .../trait/waypoint/LinearWaypointProvider.java | 5 +++++ .../trait/waypoint/WanderWaypointProvider.java | 8 ++++++++ .../trait/waypoint/WaypointProvider.java | 5 +++++ .../net/citizensnpcs/trait/waypoint/Waypoints.java | 14 ++++++++------ 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java index a35589fe7..012b65a7c 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java @@ -138,6 +138,11 @@ public class GuidedWaypointProvider implements WaypointProvider { rebuildTree(); } + @Override + public void onRemove() { + npc.getDefaultGoalController().removeGoal(currentGoal); + } + @Override public void onSpawn(NPC npc) { this.npc = npc; diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index 663a0556a..fb0225199 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -86,6 +86,11 @@ public class LinearWaypointProvider implements WaypointProvider { } } + @Override + public void onRemove() { + npc.getDefaultGoalController().removeGoal(currentGoal); + } + @Override public void onSpawn(NPC npc) { this.npc = npc; diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java index 3bf3de109..32a9c3823 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; public class WanderWaypointProvider implements WaypointProvider { private Goal currentGoal; + private NPC npc; private volatile boolean paused; @Persist private final int xrange = DEFAULT_XRANGE; @@ -42,8 +43,14 @@ public class WanderWaypointProvider implements WaypointProvider { public void load(DataKey key) { } + @Override + public void onRemove() { + npc.getDefaultGoalController().removeGoal(currentGoal); + } + @Override public void onSpawn(NPC npc) { + this.npc = npc; if (currentGoal == null) { currentGoal = WanderGoal.createWithNPCAndRange(npc, xrange, yrange); CitizensAPI.registerEvents(currentGoal); @@ -61,5 +68,6 @@ public class WanderWaypointProvider implements WaypointProvider { } private static final int DEFAULT_XRANGE = 3; + private static final int DEFAULT_YRANGE = 25; } diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java index 25481de30..ce3f5d107 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java @@ -33,6 +33,11 @@ public interface WaypointProvider { */ public void load(DataKey key); + /** + * Called when the provider is removed from the NPC. + */ + public void onRemove(); + /** * Called when the {@link NPC} attached to this provider is spawned. * diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java index 1a36b5cea..2af3a848f 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java @@ -81,8 +81,9 @@ public class Waypoints extends Trait { @Override public void onSpawn() { - if (provider != null) + if (provider != null) { provider.onSpawn(getNPC()); + } } @Override @@ -105,14 +106,15 @@ public class Waypoints extends Trait { public boolean setWaypointProvider(String name) { name = name.toLowerCase(); Class clazz = providers.get(name); - if (clazz == null) - return false; - provider = create(clazz); - if (provider == null) + if (provider != null) { + provider.onRemove(); + } + if (clazz == null || (provider = create(clazz)) == null) return false; providerName = name; - if (npc != null && npc.isSpawned()) + if (npc != null && npc.isSpawned()) { provider.onSpawn(npc); + } return true; }