diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index 95978e160..88d3bb199 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -365,9 +365,10 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { private void ensureItr() { if (itr == null) { - itr = waypoints.iterator(); - } else if (!itr.hasNext()) + itr = getUnsafeIterator(); + } else if (!itr.hasNext()) { itr = getNewIterator(); + } } private Navigator getNavigator() { @@ -376,18 +377,39 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { private Iterator getNewIterator() { LinearWaypointsCompleteEvent event = new LinearWaypointsCompleteEvent(LinearWaypointProvider.this, - waypoints.iterator()); + getUnsafeIterator()); Bukkit.getPluginManager().callEvent(event); Iterator next = event.getNextWaypoints(); return next; } + private Iterator getUnsafeIterator() { + return new Iterator() { + int idx = 0; + + @Override + public boolean hasNext() { + return idx < waypoints.size(); + } + + @Override + public Waypoint next() { + return waypoints.get(idx++); + } + + @Override + public void remove() { + waypoints.remove(Math.max(0, idx - 1)); + } + }; + } + public boolean isPaused() { return paused; } public void onProviderChanged() { - itr = waypoints.iterator(); + itr = getUnsafeIterator(); if (currentDestination != null) { if (selector != null) { selector.finish();