diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/MapScriptContainer.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/MapScriptContainer.java index 28ccfe875f..a8a7efd59c 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/MapScriptContainer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/MapScriptContainer.java @@ -63,9 +63,10 @@ public MapScriptContainer(YamlConfiguration configurationSection, String scriptC // # Specify a cursor - {RED|GREEN|WHITE|BLUE)_POINTER, WHITE_CROSS, WHITE_CIRCLE, RED_MARKER, SMALL_WHITE_CIRCLE, // # MANSION, TEMPLE // cursor: red_marker - // # Supported on all objects: x/y positions. + // # Supported on all objects: x/y positions, and whether to use worldly or map coordinates. // x: 5 // y: 5 + // world_coordinates: false // // // --> @@ -98,6 +99,7 @@ public void applyTo(MapView mapView) { String x = objectSection.getString("X", "0"); String y = objectSection.getString("Y", "0"); String visible = objectSection.getString("VISIBLE", "true"); + boolean worldC = objectSection.contains("WORLD_COORDINATES") && aH.getBooleanFrom(objectSection.getString("WORLD_COORDINATES", "false")); if (type.equals("IMAGE")) { if (!objectSection.contains("IMAGE")) { dB.echoError("Map script '" + getName() + "'s image '" + objectKey @@ -141,6 +143,12 @@ else if (type.equals("DOT")) { renderer.addObject(new MapDot(x, y, visible, debug, objectSection.getString("RADIUS", "1"), objectSection.getString("COLOR", "black"))); } + else { + dB.echoError("Weird map data!"); + } + if (worldC && renderer.mapObjects.size() > 0) { + renderer.mapObjects.get(renderer.mapObjects.size() - 1).worldCoordinates = true; + } } } DenizenMapManager.setMap(mapView, renderer); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java index 5d970ee4a8..cc5dc452d4 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapManager.java @@ -2,6 +2,7 @@ import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.objects.aH; import net.aufdemrand.denizencore.utilities.CoreUtilities; import net.aufdemrand.denizencore.utilities.NaturalOrderComparator; import org.bukkit.Bukkit; @@ -74,7 +75,8 @@ public static void reloadMaps() { String xTag = objectsData.getString(objectKey + ".x"); String yTag = objectsData.getString(objectKey + ".y"); String visibilityTag = objectsData.getString(objectKey + ".visibility"); - boolean debug = objectsData.getBoolean(objectKey + ".debug"); + boolean debug = aH.getBooleanFrom(objectsData.getString(objectKey + ".debug", "false")); + boolean worldC = aH.getBooleanFrom(objectsData.getString(objectKey + ".world_coordinates", "false")); MapObject object = null; if (type.equals("CURSOR")) { object = new MapCursor(xTag, yTag, visibilityTag, debug, @@ -97,6 +99,7 @@ else if (type.equals("TEXT")) { objectsData.getString(objectKey + ".text")); } if (object != null) { + object.worldCoordinates = worldC; renderer.addObject(object); } } diff --git a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java index 79c5404145..db01dc21f0 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/DenizenMapRenderer.java @@ -12,7 +12,7 @@ public class DenizenMapRenderer extends MapRenderer { - private List mapObjects = new ArrayList(); + public List mapObjects = new ArrayList(); private List oldMapRenderers; private boolean autoUpdate; @@ -92,6 +92,7 @@ public void render(MapView mapView, MapCanvas mapCanvas, Player player) { dPlayer p = dPlayer.mirrorBukkitPlayer(player); for (MapObject object : mapObjects) { if (autoUpdate) { + object.lastMap = mapView; object.update(p, uuid); } if (object.isVisibleTo(p, uuid)) { diff --git a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/MapObject.java b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/MapObject.java index 0bd6cccabe..afa8ee57ec 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/MapObject.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/utilities/maps/MapObject.java @@ -21,6 +21,10 @@ public abstract class MapObject { protected Map currentVisibility = new HashMap(); protected boolean debug; + public MapView lastMap; + + public boolean worldCoordinates = false; + public MapObject(String xTag, String yTag, String visibilityTag, boolean debug) { this.xTag = xTag; this.yTag = yTag; @@ -29,25 +33,37 @@ public MapObject(String xTag, String yTag, String visibilityTag, boolean debug) } public void update(dPlayer player, UUID uuid) { - currentX.put(uuid, (int) aH.getDoubleFrom(tag(xTag, player))); - currentY.put(uuid, (int) aH.getDoubleFrom(tag(yTag, player))); + currentX.put(uuid, getX(player, uuid)); + currentY.put(uuid, getY(player, uuid)); currentVisibility.put(uuid, aH.getBooleanFrom(tag(visibilityTag, player))); } public int getX(dPlayer player, UUID uuid) { - if (!currentX.containsKey(uuid)) { + //if (!currentX.containsKey(uuid)) { int x = (int) aH.getDoubleFrom(tag(xTag, player)); currentX.put(uuid, x); + //} + int tx = x; + if (worldCoordinates && lastMap != null) { + float f = (float) (tx - lastMap.getCenterX()) / (1 << (lastMap.getScale().getValue())); + byte bx = (byte) ((int) ((f * 2.0F) + 0.5D)); + return bx; } - return currentX.get(uuid); + return tx; } public int getY(dPlayer player, UUID uuid) { - if (!currentY.containsKey(uuid)) { + //if (!currentY.containsKey(uuid)) { int y = (int) aH.getDoubleFrom(tag(yTag, player)); currentY.put(uuid, y); + //} + int ty = y; + if (worldCoordinates && lastMap != null) { + float f1 = (float) (ty - lastMap.getCenterZ()) / (1 << (lastMap.getScale().getValue())); + byte by = (byte) ((int) ((f1 * 2.0F) + 0.5D)); + return by; } - return currentY.get(uuid); + return ty; } public boolean isVisibleTo(dPlayer player, UUID uuid) { @@ -68,6 +84,7 @@ public Map getSaveData() { data.put("y", yTag); data.put("visibility", visibilityTag); data.put("debug", debug ? "true" : "false"); + data.put("world_coordinates", worldCoordinates ? "true" : "false"); return data; }