Skip to content

Commit

Permalink
Improve map handling
Browse files Browse the repository at this point in the history
Reloading and saving should now work flawlessly
  • Loading branch information
Morphan1 committed Jan 2, 2015
1 parent c889335 commit 5c42afe
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 34 deletions.
Expand Up @@ -16,6 +16,8 @@
import org.bukkit.map.MapRenderer;
import org.bukkit.map.MapView;

import java.util.List;

public class MapCommand extends AbstractCommand {

@Override
Expand Down Expand Up @@ -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<MapRenderer> 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 {
Expand Down
Expand Up @@ -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;
Expand All @@ -32,6 +31,12 @@ public class DenizenMapManager {
private static YamlConfiguration mapsConfig;

public static void reloadMaps() {
Map<Short, List<MapRenderer>> oldMapRenderers = new HashMap<Short, List<MapRenderer>>();
for (Map.Entry<Short, DenizenMapRenderer> entry : mapRenderers.entrySet()) {
DenizenMapRenderer renderer = entry.getValue();
oldMapRenderers.put(entry.getKey(), renderer.getOldRenderers());
renderer.deactivate();
}
mapRenderers.clear();
downloadedByUrl.clear();
mapsConfig = YamlConfiguration.loadConfiguration(mapsFile);
Expand All @@ -47,7 +52,15 @@ public static void reloadMaps() {
continue;
}
ConfigurationSection objectsData = mapsSection.getConfigurationSection(key + ".objects");
List<MapRenderer> oldRenderers = mapView.getRenderers();
List<MapRenderer> 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<String> objects = new ArrayList<String>(objectsData.getKeys(false));
Expand Down Expand Up @@ -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<Short, List<MapRenderer>> 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;
Expand All @@ -94,8 +116,10 @@ else if (type.equals("TEXT")) {
}

public static void saveMaps() {
for (Map.Entry<Short, DenizenMapRenderer> entry : mapRenderers.entrySet())
mapsConfig.set("MAPS." + entry.getKey(), entry.getValue().getSaveData());
for (Map.Entry<Short, DenizenMapRenderer> entry : mapRenderers.entrySet()) {
if (entry.getValue().isActive())
mapsConfig.set("MAPS." + entry.getKey(), entry.getValue().getSaveData());
}
for (Map.Entry<String, String> entry : downloadedByUrl.entrySet())
mapsConfig.set("DOWNLOADED." + entry.getValue().replace(".", "DOT"), entry.getKey());
try {
Expand All @@ -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);
Expand All @@ -127,6 +151,19 @@ public static DenizenMapRenderer getDenizenRenderer(MapView map) {
return dmr;
}

public static List<MapRenderer> removeDenizenRenderers(MapView map) {
List<MapRenderer> oldRenderers = new ArrayList<MapRenderer>();
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://"))
Expand Down
Expand Up @@ -14,41 +14,67 @@ public class DenizenMapRenderer extends MapRenderer {
private final List<MapRenderer> oldMapRenderers;
private final boolean autoUpdate;

private boolean active;

public DenizenMapRenderer(List<MapRenderer> 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<MapRenderer> 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<String, Object> getSaveData() {
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> objects = new HashMap<String, Object>();
for (int i = 0; i < mapObjects.size(); i++) {
Map<String, Object> objectData = mapObjects.get(i).getSaveData();
objects.put(String.valueOf(i), objectData);
if (active) {
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> objects = new HashMap<String, Object>();
for (int i = 0; i < mapObjects.size(); i++) {
Map<String, Object> 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);
}
}

Expand Down

0 comments on commit 5c42afe

Please sign in to comment.