Server-side multiworld support with several improvements overal.

This commit is contained in:
FrozenCow 2011-02-12 23:45:33 +01:00
parent 2fd91ef94b
commit 5b0171c459
20 changed files with 398 additions and 296 deletions

View file

@ -4,12 +4,11 @@ import java.awt.Color;
import java.util.Map;
import org.bukkit.World;
import org.dynmap.debug.Debugger;
public class CaveTileRenderer extends DefaultTileRenderer {
public CaveTileRenderer(Debugger debugger, Map<String, Object> configuration) {
super(debugger, configuration);
public CaveTileRenderer(Map<String, Object> configuration) {
super(configuration);
}
@Override

View file

@ -10,24 +10,23 @@ import java.util.Map;
import javax.imageio.ImageIO;
import org.bukkit.World;
import org.dynmap.debug.Debugger;
import org.dynmap.debug.Debug;
public class DefaultTileRenderer implements MapTileRenderer {
protected static Color translucent = new Color(0, 0, 0, 0);
private String name;
protected Debugger debugger;
@Override
public String getName() {
return name;
}
public DefaultTileRenderer(Debugger debugger, Map<String, Object> configuration) {
this.debugger = debugger;
public DefaultTileRenderer(Map<String, Object> configuration) {
name = (String) configuration.get("prefix");
}
public boolean render(KzedMapTile tile, String path) {
World world = tile.getMap().getWorld();
public boolean render(KzedMapTile tile, File outputFile) {
World world = tile.getWorld();
BufferedImage im = new BufferedImage(KzedMap.tileWidth, KzedMap.tileHeight, BufferedImage.TYPE_INT_RGB);
WritableRaster r = im.getRaster();
@ -92,9 +91,11 @@ public class DefaultTileRenderer implements MapTileRenderer {
}
/* save the generated tile */
saveTile(tile, im, path);
saveImage(im, outputFile);
im.flush();
((KzedMap) tile.getMap()).invalidateTile(new KzedZoomedMapTile((KzedMap) tile.getMap(), tile));
tile.file = outputFile;
((KzedMap) tile.getMap()).invalidateTile(new KzedZoomedMapTile(world, (KzedMap) tile.getMap(), tile));
return !isempty;
}
@ -154,23 +155,15 @@ public class DefaultTileRenderer implements MapTileRenderer {
}
/* save rendered tile, update zoom-out tile */
public void saveTile(KzedMapTile tile, BufferedImage im, String path) {
String tilePath = getPath(tile, path);
debugger.debug("saving tile " + tilePath);
public void saveImage(BufferedImage im, File outputFile) {
Debug.debug("saving image " + outputFile.getPath());
/* save image */
try {
File file = new File(tilePath);
ImageIO.write(im, "png", file);
ImageIO.write(im, "png", outputFile);
} catch (IOException e) {
debugger.error("Failed to save tile: " + tilePath, e);
Debug.error("Failed to save image: " + outputFile.getPath(), e);
} catch (java.lang.NullPointerException e) {
debugger.error("Failed to save tile (NullPointerException): " + tilePath, e);
Debug.error("Failed to save image (NullPointerException): " + outputFile.getPath(), e);
}
}
public static String getPath(KzedMapTile tile, String outputPath) {
return new File(new File(outputPath), tile.getName() + ".png").getPath();
}
}

View file

@ -18,6 +18,7 @@ import org.dynmap.DynmapChunk;
import org.dynmap.MapManager;
import org.dynmap.MapTile;
import org.dynmap.MapType;
import org.dynmap.debug.Debug;
import org.dynmap.debug.Debugger;
public class KzedMap extends MapType {
@ -43,14 +44,13 @@ public class KzedMap extends MapType {
MapTileRenderer[] renderers;
ZoomedTileRenderer zoomrenderer;
public KzedMap(MapManager manager, World world, Debugger debugger, Map<String, Object> configuration) {
super(manager, world, debugger);
public KzedMap(Map<String, Object> configuration) {
if (colors == null) {
colors = loadColorSet("colors.txt");
}
renderers = loadRenderers(configuration);
zoomrenderer = new ZoomedTileRenderer(debugger, configuration);
zoomrenderer = new ZoomedTileRenderer(configuration);
}
private MapTileRenderer[] loadRenderers(Map<String, Object> configuration) {
@ -63,11 +63,12 @@ public class KzedMap extends MapType {
String typeName = (String) configuredRenderer.get("class");
log.info("Loading renderer '" + typeName.toString() + "'...");
Class<?> mapTypeClass = Class.forName(typeName);
Constructor<?> constructor = mapTypeClass.getConstructor(Debugger.class, Map.class);
MapTileRenderer mapTileRenderer = (MapTileRenderer) constructor.newInstance(getDebugger(), configuredRenderer);
Constructor<?> constructor = mapTypeClass.getConstructor(Map.class);
MapTileRenderer mapTileRenderer = (MapTileRenderer) constructor.newInstance(configuredRenderer);
renderers.add(mapTileRenderer);
} catch (Exception e) {
getDebugger().error("Error loading renderer", e);
Debug.error("Error loading renderer", e);
e.printStackTrace();
}
}
MapTileRenderer[] result = new MapTileRenderer[renderers.size()];
@ -77,6 +78,8 @@ public class KzedMap extends MapType {
@Override
public MapTile[] getTiles(Location l) {
World world = l.getWorld();
int x = l.getBlockX();
int y = l.getBlockY();
int z = l.getBlockZ();
@ -92,7 +95,7 @@ public class KzedMap extends MapType {
ArrayList<MapTile> tiles = new ArrayList<MapTile>();
addTile(tiles, tx, ty);
addTile(tiles, world, tx, ty);
boolean ledge = tilex(px - 4) != tx;
boolean tedge = tiley(py - 4) != ty;
@ -100,22 +103,22 @@ public class KzedMap extends MapType {
boolean bedge = tiley(py + 4) != ty;
if (ledge)
addTile(tiles, tx - tileWidth, ty);
addTile(tiles, world, tx - tileWidth, ty);
if (redge)
addTile(tiles, tx + tileWidth, ty);
addTile(tiles, world, tx + tileWidth, ty);
if (tedge)
addTile(tiles, tx, ty - tileHeight);
addTile(tiles, world, tx, ty - tileHeight);
if (bedge)
addTile(tiles, tx, ty + tileHeight);
addTile(tiles, world, tx, ty + tileHeight);
if (ledge && tedge)
addTile(tiles, tx - tileWidth, ty - tileHeight);
addTile(tiles, world, tx - tileWidth, ty - tileHeight);
if (ledge && bedge)
addTile(tiles, tx - tileWidth, ty + tileHeight);
addTile(tiles, world, tx - tileWidth, ty + tileHeight);
if (redge && tedge)
addTile(tiles, tx + tileWidth, ty - tileHeight);
addTile(tiles, world, tx + tileWidth, ty - tileHeight);
if (redge && bedge)
addTile(tiles, tx + tileWidth, ty + tileHeight);
addTile(tiles, world, tx + tileWidth, ty + tileHeight);
MapTile[] result = new MapTile[tiles.size()];
tiles.toArray(result);
@ -126,24 +129,25 @@ public class KzedMap extends MapType {
public MapTile[] getAdjecentTiles(MapTile tile) {
if (tile instanceof KzedMapTile) {
KzedMapTile t = (KzedMapTile) tile;
World world = tile.getWorld();
MapTileRenderer renderer = t.renderer;
return new MapTile[] {
new KzedMapTile(this, renderer, t.px - tileWidth, t.py),
new KzedMapTile(this, renderer, t.px + tileWidth, t.py),
new KzedMapTile(this, renderer, t.px, t.py - tileHeight),
new KzedMapTile(this, renderer, t.px, t.py + tileHeight) };
new KzedMapTile(world, this, renderer, t.px - tileWidth, t.py),
new KzedMapTile(world, this, renderer, t.px + tileWidth, t.py),
new KzedMapTile(world, this, renderer, t.px, t.py - tileHeight),
new KzedMapTile(world, this, renderer, t.px, t.py + tileHeight) };
}
return new MapTile[0];
}
public void addTile(ArrayList<MapTile> tiles, int px, int py) {
public void addTile(ArrayList<MapTile> tiles, World world, int px, int py) {
for (int i = 0; i < renderers.length; i++) {
tiles.add(new KzedMapTile(this, renderers[i], px, py));
tiles.add(new KzedMapTile(world, this, renderers[i], px, py));
}
}
public void invalidateTile(MapTile tile) {
getMapManager().invalidateTile(tile);
onTileInvalidated.trigger(tile);
}
@Override
@ -174,21 +178,12 @@ public class KzedMap extends MapType {
}
@Override
public boolean render(MapTile tile) {
public boolean render(MapTile tile, File outputFile) {
if (tile instanceof KzedZoomedMapTile) {
zoomrenderer.render((KzedZoomedMapTile) tile, getMapManager().tileDirectory.getAbsolutePath());
zoomrenderer.render((KzedZoomedMapTile) tile, outputFile);
return true;
} else if (tile instanceof KzedMapTile) {
return ((KzedMapTile) tile).renderer.render((KzedMapTile) tile, getMapManager().tileDirectory.getAbsolutePath());
}
return false;
}
@Override
public boolean isRendered(MapTile tile) {
if (tile instanceof KzedMapTile) {
File tileFile = new File(DefaultTileRenderer.getPath((KzedMapTile) tile, getMapManager().tileDirectory.getAbsolutePath()));
return tileFile.exists();
return ((KzedMapTile) tile).renderer.render((KzedMapTile) tile, outputFile);
}
return false;
}
@ -235,10 +230,10 @@ public class KzedMap extends MapType {
/* load colorset */
File cfile = new File(colorsetpath);
if (cfile.isFile()) {
getDebugger().debug("Loading colors from '" + colorsetpath + "'...");
Debug.debug("Loading colors from '" + colorsetpath + "'...");
stream = new FileInputStream(cfile);
} else {
getDebugger().debug("Loading colors from jar...");
Debug.debug("Loading colors from jar...");
stream = KzedMap.class.getResourceAsStream("/colors.txt");
}
@ -270,7 +265,7 @@ public class KzedMap extends MapType {
}
scanner.close();
} catch (Exception e) {
getDebugger().error("Could not load colors", e);
Debug.error("Could not load colors", e);
return null;
}
return colors;

View file

@ -1,25 +1,20 @@
package org.dynmap.kzedmap;
import java.util.logging.Logger;
import java.io.File;
import org.bukkit.World;
import org.dynmap.MapTile;
public class KzedMapTile extends MapTile {
protected static final Logger log = Logger.getLogger("Minecraft");
public KzedMap map;
public MapTileRenderer renderer;
/* projection position */
public int px, py;
/* minecraft space origin */
public int mx, my, mz;
// Hack.
public File file = null;
/* create new MapTile */
public KzedMapTile(KzedMap map, MapTileRenderer renderer, int px, int py) {
super(map);
public KzedMapTile(World world, KzedMap map, MapTileRenderer renderer, int px, int py) {
super(world, map);
this.map = map;
this.renderer = renderer;
this.px = px;
@ -31,12 +26,13 @@ public class KzedMapTile extends MapTile {
}
@Override
public String getName() {
return renderer.getName() + "_" + px + "_" + py;
public String getFilename() {
return renderer.getName() + "_" + px + "_" + py + ".png";
}
@Override
public int hashCode() {
return getName().hashCode();
return getFilename().hashCode() ^ getWorld().hashCode();
}
@Override
@ -48,11 +44,10 @@ public class KzedMapTile extends MapTile {
}
public boolean equals(KzedMapTile o) {
return o.getName().equals(getName());
return o.px == px && o.py == py && o.getWorld().equals(getWorld());
}
/* return a simple string representation... */
public String toString() {
return getName();
return getWorld().getName() + ":" + getFilename();
}
}

View file

@ -2,18 +2,19 @@ package org.dynmap.kzedmap;
import java.awt.image.BufferedImage;
import org.bukkit.World;
import org.dynmap.MapTile;
public class KzedZoomedMapTile extends MapTile {
@Override
public String getName() {
return "z" + originalTile.renderer.getName() + "_" + getTileX() + "_" + getTileY();
public String getFilename() {
return "z" + originalTile.renderer.getName() + "_" + getTileX() + "_" + getTileY() + ".png";
}
public KzedMapTile originalTile;
public KzedZoomedMapTile(KzedMap map, KzedMapTile original) {
super(map);
public KzedZoomedMapTile(World world, KzedMap map, KzedMapTile original) {
super(world, map);
this.originalTile = original;
}
@ -42,7 +43,7 @@ public class KzedZoomedMapTile extends MapTile {
@Override
public int hashCode() {
return getName().hashCode();
return getFilename().hashCode() ^ getWorld().hashCode();
}
@Override

View file

@ -1,7 +1,9 @@
package org.dynmap.kzedmap;
import java.io.File;
public interface MapTileRenderer {
String getName();
boolean render(KzedMapTile tile, String path);
boolean render(KzedMapTile tile, File outputFile);
}

View file

@ -6,19 +6,14 @@ import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import javax.imageio.ImageIO;
import org.dynmap.debug.Debugger;
import org.dynmap.debug.Debug;
public class ZoomedTileRenderer {
protected Debugger debugger;
public ZoomedTileRenderer(Debugger debugger, Map<String, Object> configuration) {
this.debugger = debugger;
public ZoomedTileRenderer(Map<String, Object> configuration) {
}
public void render(KzedZoomedMapTile zt, String outputPath) {
public void render(KzedZoomedMapTile zt, File outputPath) {
KzedMapTile originalTile = zt.originalTile;
int px = originalTile.px;
int py = originalTile.py;
@ -27,17 +22,17 @@ public class ZoomedTileRenderer {
BufferedImage image = null;
try {
image = ImageIO.read(new File(new File(outputPath), originalTile.getName() + ".png"));
image = ImageIO.read(originalTile.file);
} catch (IOException e) {
}
if (image == null) {
debugger.debug("Could not load original tile, won't render zoom-out tile.");
Debug.debug("Could not load original tile, won't render zoom-out tile.");
return;
}
BufferedImage zIm = null;
File zoomFile = new File(new File(outputPath), zt.getName() + ".png");
File zoomFile = outputPath;
try {
zIm = ImageIO.read(zoomFile);
} catch (IOException e) {
@ -46,9 +41,9 @@ public class ZoomedTileRenderer {
if (zIm == null) {
/* create new one */
zIm = new BufferedImage(KzedMap.tileWidth, KzedMap.tileHeight, BufferedImage.TYPE_INT_RGB);
debugger.debug("New zoom-out tile created " + zt.getName());
Debug.debug("New zoom-out tile created " + zt.getFilename());
} else {
debugger.debug("Loaded zoom-out tile from " + zt.getName());
Debug.debug("Loaded zoom-out tile from " + zt.getFilename());
}
/* update zoom-out tile */
@ -77,11 +72,11 @@ public class ZoomedTileRenderer {
/* save zoom-out tile */
try {
ImageIO.write(zIm, "png", zoomFile);
debugger.debug("Saved zoom-out tile at " + zoomFile.getName());
Debug.debug("Saved zoom-out tile at " + zoomFile.getName());
} catch (IOException e) {
debugger.error("Failed to save zoom-out tile: " + zoomFile.getName(), e);
Debug.error("Failed to save zoom-out tile: " + zoomFile.getName(), e);
} catch (java.lang.NullPointerException e) {
debugger.error("Failed to save zoom-out tile (NullPointerException): " + zoomFile.getName(), e);
Debug.error("Failed to save zoom-out tile (NullPointerException): " + zoomFile.getName(), e);
}
zIm.flush();
}