diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/item/MapCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/item/MapCommand.java index 852ed00ad1..6e9e2d822e 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/item/MapCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/item/MapCommand.java @@ -16,6 +16,8 @@ import org.bukkit.map.MapRenderer; import org.bukkit.map.MapView; +import java.util.List; + public class MapCommand extends AbstractCommand { @Override @@ -137,20 +139,18 @@ else if (id != null) { } if (reset.asBoolean()) { - for (MapRenderer renderer : map.getRenderers()) { - if (renderer instanceof DenizenMapRenderer) { - map.removeRenderer(renderer); - for (MapRenderer oldRenderer : ((DenizenMapRenderer) renderer).getOldRenderers()) - map.addRenderer(oldRenderer); - if (resetLoc != null) { - map.setCenterX(resetLoc.getBlockX()); - map.setCenterZ(resetLoc.getBlockZ()); - map.setWorld(resetLoc.getWorld()); - } - } + List oldRenderers = DenizenMapManager.removeDenizenRenderers(map); + for (MapRenderer renderer : oldRenderers) { + map.addRenderer(renderer); + } + if (resetLoc != null) { + map.setCenterX(resetLoc.getBlockX()); + map.setCenterZ(resetLoc.getBlockZ()); + map.setWorld(resetLoc.getWorld()); } } else if (script != null) { + DenizenMapManager.removeDenizenRenderers(map); ((MapScriptContainer) script.getContainer()).applyTo(map); } else { diff --git a/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java b/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java index bf8c66d620..c0f1c169cb 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java @@ -12,7 +12,6 @@ import javax.imageio.stream.FileImageOutputStream; import java.io.BufferedInputStream; import java.io.File; -import java.io.FilenameFilter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -32,6 +31,12 @@ public class DenizenMapManager { private static YamlConfiguration mapsConfig; public static void reloadMaps() { + Map> oldMapRenderers = new HashMap>(); + for (Map.Entry entry : mapRenderers.entrySet()) { + DenizenMapRenderer renderer = entry.getValue(); + oldMapRenderers.put(entry.getKey(), renderer.getOldRenderers()); + renderer.deactivate(); + } mapRenderers.clear(); downloadedByUrl.clear(); mapsConfig = YamlConfiguration.loadConfiguration(mapsFile); @@ -47,7 +52,15 @@ public static void reloadMaps() { continue; } ConfigurationSection objectsData = mapsSection.getConfigurationSection(key + ".objects"); - List oldRenderers = mapView.getRenderers(); + List oldRenderers; + if (oldMapRenderers.containsKey(mapId)) { + oldRenderers = oldMapRenderers.get(mapId); + } + else { + oldRenderers = mapView.getRenderers(); + for (MapRenderer oldRenderer : oldRenderers) + mapView.removeRenderer(oldRenderer); + } DenizenMapRenderer renderer = new DenizenMapRenderer(oldRenderers, mapsSection.getBoolean(key + ".auto update", false)); List objects = new ArrayList(objectsData.getKeys(false)); @@ -80,11 +93,20 @@ else if (type.equals("TEXT")) { if (object != null) renderer.addObject(object); } - for (MapRenderer oldRenderer : oldRenderers) - mapView.removeRenderer(oldRenderer); mapView.addRenderer(renderer); mapRenderers.put(mapId, renderer); } + for (Map.Entry> entry : oldMapRenderers.entrySet()) { + short id = entry.getKey(); + if (!mapRenderers.containsKey(id)) { + MapView mapView = Bukkit.getServer().getMap(id); + if (mapView != null) { + for (MapRenderer renderer : entry.getValue()) + mapView.addRenderer(renderer); + } + // If it's null, the server no longer has the map - don't do anything about it + } + } ConfigurationSection downloadedImages = mapsConfig.getConfigurationSection("DOWNLOADED"); if (downloadedImages == null) return; @@ -94,8 +116,10 @@ else if (type.equals("TEXT")) { } public static void saveMaps() { - for (Map.Entry entry : mapRenderers.entrySet()) - mapsConfig.set("MAPS." + entry.getKey(), entry.getValue().getSaveData()); + for (Map.Entry entry : mapRenderers.entrySet()) { + if (entry.getValue().isActive()) + mapsConfig.set("MAPS." + entry.getKey(), entry.getValue().getSaveData()); + } for (Map.Entry entry : downloadedByUrl.entrySet()) mapsConfig.set("DOWNLOADED." + entry.getValue().replace(".", "DOT"), entry.getKey()); try { @@ -116,7 +140,7 @@ public static void setMap(MapView map, DenizenMapRenderer denizenMapRenderer) { public static DenizenMapRenderer getDenizenRenderer(MapView map) { short mapId = map.getId(); - DenizenMapRenderer dmr = null; + DenizenMapRenderer dmr; if (!mapRenderers.containsKey(mapId)) { dmr = new DenizenMapRenderer(map.getRenderers(), false); setMap(map, dmr); @@ -127,6 +151,19 @@ public static DenizenMapRenderer getDenizenRenderer(MapView map) { return dmr; } + public static List removeDenizenRenderers(MapView map) { + List oldRenderers = new ArrayList(); + for (MapRenderer renderer : map.getRenderers()) { + if (renderer instanceof DenizenMapRenderer) { + map.removeRenderer(renderer); + oldRenderers.addAll(((DenizenMapRenderer) renderer).getOldRenderers()); + ((DenizenMapRenderer) renderer).deactivate(); + mapRenderers.remove(map.getId()); + } + } + return oldRenderers; + } + public static String getActualFile(String file) { String fileLower = file.toLowerCase(); if (!fileLower.startsWith("http://") && !fileLower.startsWith("https://")) diff --git a/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java b/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java index b10edc4c57..c4b7dae657 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java @@ -14,41 +14,67 @@ public class DenizenMapRenderer extends MapRenderer { private final List oldMapRenderers; private final boolean autoUpdate; + private boolean active; + public DenizenMapRenderer(List oldMapRenderers, boolean autoUpdate) { super(true); this.oldMapRenderers = oldMapRenderers; this.autoUpdate = autoUpdate; + this.active = true; } public void addObject(MapObject object) { - mapObjects.add(object); + if (active) + mapObjects.add(object); + else + throw new IllegalStateException("DenizenMapRenderer is not active"); } public List getOldRenderers() { return oldMapRenderers; } + public void deactivate() { + if (!active) + throw new IllegalStateException("Already deactivated"); + this.active = false; + mapObjects.clear(); + oldMapRenderers.clear(); + } + + public boolean isActive() { + return active; + } + public Map getSaveData() { - Map data = new HashMap(); - Map objects = new HashMap(); - for (int i = 0; i < mapObjects.size(); i++) { - Map objectData = mapObjects.get(i).getSaveData(); - objects.put(String.valueOf(i), objectData); + if (active) { + Map data = new HashMap(); + Map objects = new HashMap(); + for (int i = 0; i < mapObjects.size(); i++) { + Map objectData = mapObjects.get(i).getSaveData(); + objects.put(String.valueOf(i), objectData); + } + data.put("objects", objects); + data.put("auto update", autoUpdate); + return data; } - data.put("objects", objects); - data.put("auto update", autoUpdate); - return data; + throw new IllegalStateException("DenizenMapRenderer is not active"); } @Override public void render(MapView mapView, MapCanvas mapCanvas, Player player) { - UUID uuid = player.getUniqueId(); - dPlayer p = dPlayer.mirrorBukkitPlayer(player); - for (MapObject object : mapObjects) { - if (autoUpdate) - object.update(p, uuid); - if (object.isVisibleTo(p, uuid)) - object.render(mapView, mapCanvas, p, uuid); + if (active) { + UUID uuid = player.getUniqueId(); + dPlayer p = dPlayer.mirrorBukkitPlayer(player); + for (MapObject object : mapObjects) { + if (autoUpdate) + object.update(p, uuid); + if (object.isVisibleTo(p, uuid)) + object.render(mapView, mapCanvas, p, uuid); + } + } + else { + mapView.removeRenderer(this); } }