From 9c3fb306232d45023cee932c42bd871397f42481 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 10 Mar 2018 23:34:42 +0800 Subject: [PATCH] Do some cleanup of WaypointMarkers to be more generic --- .../trait/waypoint/EntityMarkers.java | 48 +++++++++++++++++++ .../waypoint/GuidedWaypointProvider.java | 12 ++--- .../waypoint/LinearWaypointProvider.java | 19 ++++---- .../trait/waypoint/Locatable.java | 7 +++ .../citizensnpcs/trait/waypoint/Waypoint.java | 3 +- .../trait/waypoint/WaypointEditor.java | 2 +- 6 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java create mode 100644 main/src/main/java/net/citizensnpcs/trait/waypoint/Locatable.java diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java new file mode 100644 index 000000000..daa3620ef --- /dev/null +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/EntityMarkers.java @@ -0,0 +1,48 @@ +package net.citizensnpcs.trait.waypoint; + +import java.util.Map; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; + +import com.google.common.collect.Maps; + +import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.npc.MemoryNPCDataStore; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.npc.NPCRegistry; + +public class EntityMarkers { + private final Map markers = Maps.newHashMap(); + private final NPCRegistry registry = CitizensAPI.createAnonymousNPCRegistry(new MemoryNPCDataStore()); + + public Entity createMarker(T marker, Location at) { + Entity entity = spawnMarker(at.getWorld(), at); + if (entity == null) + return null; + markers.put(marker, entity); + return entity; + } + + public void destroyMarkers() { + for (Entity entity : markers.values()) { + entity.remove(); + } + markers.clear(); + } + + public void removeMarker(T marker) { + Entity entity = markers.remove(marker); + if (entity != null) { + entity.remove(); + } + } + + public Entity spawnMarker(World world, Location at) { + NPC npc = registry.createNPC(EntityType.ENDER_SIGNAL, ""); + npc.spawn(at); + return npc.getEntity(); + } +} \ No newline at end of file diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java index 703dfb036..be7dedbbf 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java @@ -60,7 +60,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { } final Player player = (Player) sender; return new WaypointEditor() { - private final WaypointMarkers markers = new WaypointMarkers(player.getWorld()); + private final EntityMarkers markers = new EntityMarkers(); private boolean showPath; @Override @@ -71,12 +71,12 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { private void createWaypointMarkers() { for (Waypoint waypoint : Iterables.concat(available, helpers)) { - markers.createWaypointMarker(waypoint); + markers.createMarker(waypoint, waypoint.getLocation().clone().add(0, 1, 0)); } } private void createWaypointMarkerWithData(Waypoint element) { - Entity entity = markers.createWaypointMarker(element); + Entity entity = markers.createMarker(element, element.getLocation().clone().add(0, 1, 0)); if (entity == null) return; entity.setMetadata("citizens.waypointhashcode", @@ -86,7 +86,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { @Override public void end() { Messaging.sendTr(player, Messages.GUIDED_WAYPOINT_EDITOR_END); - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); } @EventHandler(ignoreCancelled = true) @@ -105,7 +105,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { available.clear(); helpers.clear(); if (showPath) - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); } }); } @@ -160,7 +160,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { createWaypointMarkers(); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_SHOWING_MARKERS); } else { - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_NOT_SHOWING_MARKERS); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index 592c51145..ba005d218 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -146,13 +146,13 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { Conversation conversation; boolean editing = true; int editingSlot = waypoints.size() - 1; - WaypointMarkers markers; + EntityMarkers markers; private final Player player; private boolean showPath; private LinearWaypointEditor(Player player) { this.player = player; - this.markers = new WaypointMarkers(player.getWorld()); + this.markers = new EntityMarkers(); } @Override @@ -164,13 +164,13 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { editingSlot = 0; waypoints.clear(); onWaypointsModified(); - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_WAYPOINTS_CLEARED); } private void createWaypointMarkers() { for (int i = 0; i < waypoints.size(); i++) { - markers.createWaypointMarker(waypoints.get(i)); + markers.createMarker(waypoints.get(i), waypoints.get(i).getLocation().clone().add(0, 1, 0)); } } @@ -178,13 +178,14 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { public void end() { if (!editing) return; - if (conversation != null) + if (conversation != null) { conversation.abandon(); + } Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_END); editing = false; if (!showPath) return; - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); } private String formatLoc(Location location) { @@ -287,7 +288,7 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { normaliseEditingSlot(); waypoints.add(editingSlot, element); if (showPath) { - markers.createWaypointMarker(element); + markers.createMarker(element, element.getLocation().clone().add(0, 1, 0)); } editingSlot = Math.min(editingSlot + 1, waypoints.size()); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_ADDED_WAYPOINT, formatLoc(at), editingSlot + 1, @@ -297,7 +298,7 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { normaliseEditingSlot(); Waypoint waypoint = waypoints.remove(editingSlot); if (showPath) { - markers.removeWaypointMarker(waypoint); + markers.removeMarker(waypoint); } editingSlot = Math.max(0, editingSlot - 1); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_REMOVED_WAYPOINT, waypoints.size(), @@ -350,7 +351,7 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { createWaypointMarkers(); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_SHOWING_MARKERS); } else { - markers.destroyWaypointMarkers(); + markers.destroyMarkers(); Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_NOT_SHOWING_MARKERS); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/Locatable.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/Locatable.java new file mode 100644 index 000000000..445dcda4d --- /dev/null +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/Locatable.java @@ -0,0 +1,7 @@ +package net.citizensnpcs.trait.waypoint; + +import org.bukkit.Location; + +public interface Locatable { + public Location getLocation(); +} \ No newline at end of file diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java index 4f42cf4e6..4ffff0404 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java @@ -16,7 +16,7 @@ import net.citizensnpcs.trait.waypoint.triggers.DelayTrigger; import net.citizensnpcs.trait.waypoint.triggers.WaypointTrigger; import net.citizensnpcs.trait.waypoint.triggers.WaypointTriggerRegistry; -public class Waypoint { +public class Waypoint implements Locatable { @Persist(required = true) private Location location; @Persist @@ -65,6 +65,7 @@ public class Waypoint { return true; } + @Override public Location getLocation() { return location; } diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/WaypointEditor.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/WaypointEditor.java index b465e9be5..b1b8dbbb9 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/WaypointEditor.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/WaypointEditor.java @@ -6,4 +6,4 @@ public abstract class WaypointEditor extends Editor { public Waypoint getCurrentWaypoint() { return null; } -} +} \ No newline at end of file