diff --git a/src/main/java/net/knarcraft/stargate/PortalHandler.java b/src/main/java/net/knarcraft/stargate/PortalHandler.java
index 83dc1d8..a45f8c2 100644
--- a/src/main/java/net/knarcraft/stargate/PortalHandler.java
+++ b/src/main/java/net/knarcraft/stargate/PortalHandler.java
@@ -684,7 +684,7 @@ public class PortalHandler {
}
/**
- * Clears all loaded gates and gate data
+ * Clears all loaded gates and gate data from all worlds
*/
public static void clearGates() {
lookupBlocks.clear();
@@ -695,6 +695,44 @@ public class PortalHandler {
allPortalsNet.clear();
}
+ /**
+ * Clears all gates loaded in a given world
+ *
+ * @param world
The world containing the portals to clear
+ */
+ public static void clearGates(World world) {
+ //This is necessary
+ List portalsToRemove = new ArrayList<>();
+ allPortals.forEach((portal) -> {
+ if (portal.getWorld().equals(world)) {
+ portalsToRemove.add(portal);
+ }
+ });
+
+ clearGates(portalsToRemove);
+ }
+
+ /**
+ * Clears a given list of portals from all relevant variables
+ *
+ * @param portalsToRemove A list of portals to remove
+ */
+ private static void clearGates(List portalsToRemove) {
+ List portalNames = new ArrayList<>();
+ portalsToRemove.forEach((portal) -> portalNames.add(portal.getName()));
+ lookupBlocks.keySet().removeIf((key) -> portalsToRemove.contains(lookupBlocks.get(key)));
+ lookupNamesNet.keySet().forEach((network) -> lookupNamesNet.get(network).keySet().removeIf((key) ->
+ portalsToRemove.contains(lookupNamesNet.get(network).get(key))));
+ //Remove any networks with no portals
+ lookupNamesNet.keySet().removeIf((key) -> lookupNamesNet.get(key).isEmpty());
+ lookupEntrances.keySet().removeIf((key) -> portalsToRemove.contains(lookupEntrances.get(key)));
+ lookupControls.keySet().removeIf((key) -> portalsToRemove.contains(lookupControls.get(key)));
+ allPortals.removeIf(portalsToRemove::contains);
+ allPortalsNet.keySet().forEach((network) -> allPortalsNet.get(network).removeIf(portalNames::contains));
+ //Remove any networks with no portals
+ allPortalsNet.keySet().removeIf((network) -> allPortalsNet.get(network).isEmpty());
+ }
+
/**
* Loads all gates for the given world
*
diff --git a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java
index 9609b1a..5c0e056 100644
--- a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java
+++ b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java
@@ -8,28 +8,37 @@ import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
+/**
+ * This listener listens for the loading and unloading of worlds to load and unload stargates
+ */
+@SuppressWarnings("unused")
public class WorldEventListener implements Listener {
+
+ /**
+ * This listener listens for the loading of a world and loads all all gates from the world if not already loaded
+ *
+ * @param event The triggered world load event
+ */
@EventHandler
public void onWorldLoad(WorldLoadEvent event) {
- if (!Stargate.managedWorlds.contains(event.getWorld().getName())
- && PortalHandler.loadAllGates(event.getWorld())) {
+ if (!Stargate.managedWorlds.contains(event.getWorld().getName()) &&
+ PortalHandler.loadAllGates(event.getWorld())) {
Stargate.managedWorlds.add(event.getWorld().getName());
}
}
- // We need to reload all gates on world unload, boo
+ /**
+ * This listener listens for the unloading of a world
+ *
+ * @param event The triggered world unload event
+ */
@EventHandler
public void onWorldUnload(WorldUnloadEvent event) {
Stargate.debug("onWorldUnload", "Reloading all Stargates");
- World w = event.getWorld();
- if (Stargate.managedWorlds.contains(w.getName())) {
- Stargate.managedWorlds.remove(w.getName());
- PortalHandler.clearGates();
- for (World world : Stargate.server.getWorlds()) {
- if (Stargate.managedWorlds.contains(world.getName())) {
- PortalHandler.loadAllGates(world);
- }
- }
+ World world = event.getWorld();
+ if (Stargate.managedWorlds.contains(world.getName())) {
+ Stargate.managedWorlds.remove(world.getName());
+ PortalHandler.clearGates(world);
}
}
}