From 204bcd0310d7e874b2770d0007fa1d96f03ed652 Mon Sep 17 00:00:00 2001 From: Nicolas F Date: Sat, 6 Jul 2019 19:06:15 +0200 Subject: [PATCH] Add "center" config option This option allows you to specify your own initial center for a tileset, which is useful if your map is extremely asymmetric or you don't really care about what's around the spawn. Future work needs to be done on the JS side in order to fix the fromWorldToLatLng and friends, as they're currently off by -24 in X and +24 in Z direction. Closes #1350. --- docs/config.rst | 10 ++++++++++ overviewer.py | 2 +- overviewer_core/assetmanager.py | 1 - overviewer_core/data/js_src/util.js | 4 ++-- overviewer_core/settingsDefinition.py | 1 + overviewer_core/settingsValidators.py | 14 ++++++++++++++ overviewer_core/tileset.py | 4 +++- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/config.rst b/docs/config.rst index 08cdafc..bda4af3 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -951,6 +951,16 @@ Other HTML/JS output options **Default:** ``#1a1a1a`` +``center`` + This is allows you to specify a list or a tuple of Minecraft world coordinates + that should be used as the map's default center, e.g. ``[800, 64, -334]``. + + You may also specify only two coordinates, in case they will be interpreted as + X and Z coordinates, and Y is assumed to be ``64`` (sea level). + + **Default:** The coordinates of your spawn, or ``[0, 64, 0]`` if the regionset + has no spawn. + Map update behavior ~~~~~~~~~~~~~~~~~~~ diff --git a/overviewer.py b/overviewer.py index b5b9a47..f549542 100755 --- a/overviewer.py +++ b/overviewer.py @@ -555,7 +555,7 @@ def main(): "name", "imgformat", "renderchecks", "rerenderprob", "bgcolor", "defaultzoom", "imgquality", "imglossless", "optimizeimg", "rendermode", "worldname_orig", "title", "dimension", "changelist", "showspawn", "overlay", "base", "poititle", "maxzoom", - "showlocationmarker", "minzoom"]) + "showlocationmarker", "minzoom", "center"]) tileSetOpts.update({"spawn": w.find_true_spawn()}) # TODO find a better way to do this for rset in rsets: tset = tileset.TileSet(w, rset, assetMrg, tex, tileSetOpts, tileset_dir) diff --git a/overviewer_core/assetmanager.py b/overviewer_core/assetmanager.py index 26ba9c3..f909029 100644 --- a/overviewer_core/assetmanager.py +++ b/overviewer_core/assetmanager.py @@ -128,7 +128,6 @@ top-level directory. dump['map']['debug'] = True dump['map']['cacheTag'] = str(int(time.time())) dump['map']['north_direction'] = 'lower-left' # only temporary - dump['map']['center'] = [-314, 67, 94] dump['map']['controls'] = { 'pan': True, 'zoom': True, diff --git a/overviewer_core/data/js_src/util.js b/overviewer_core/data/js_src/util.js index 59294cb..5de6fd4 100644 --- a/overviewer_core/data/js_src/util.js +++ b/overviewer_core/data/js_src/util.js @@ -422,8 +422,8 @@ overviewer.util = { myLayer["tileSetConfig"] = obj; - if (typeof(obj.spawn) == "object") { - var latlng = overviewer.util.fromWorldToLatLng(obj.spawn[0], obj.spawn[1], obj.spawn[2], obj); + if (typeof(obj.center) == "object") { + var latlng = overviewer.util.fromWorldToLatLng(obj.center[0], obj.center[1], obj.center[2], obj); overviewer.collections.centers[obj.world] = [ latlng, obj.defaultZoom ]; } else { overviewer.collections.centers[obj.world] = [ [0, 0], obj.defaultZoom ]; diff --git a/overviewer_core/settingsDefinition.py b/overviewer_core/settingsDefinition.py index 416a1c0..1e90751 100644 --- a/overviewer_core/settingsDefinition.py +++ b/overviewer_core/settingsDefinition.py @@ -93,6 +93,7 @@ renders = Setting(required=True, default=OrderedDict(), "minzoom": Setting(required=False, validator=validateInt, default=0), "manualpois": Setting(required=False, validator=validateManualPOIs, default=[]), "showlocationmarker": Setting(required=False, validator=validateBool, default=True), + "center": Setting(required=False, validator=validateCoords, default=None), # Remove this eventually (once people update their configs) "worldname": Setting(required=False, default=None, validator=error("The option 'worldname' is now called 'world'. Please update your config files")), diff --git a/overviewer_core/settingsValidators.py b/overviewer_core/settingsValidators.py index 41a29c3..3ae70f0 100644 --- a/overviewer_core/settingsValidators.py +++ b/overviewer_core/settingsValidators.py @@ -308,6 +308,20 @@ def validateManualPOIs(d): return d +def validateCoords(c): + if not isinstance(c, (list, tuple)): + raise ValidationException("Your coordinates '{}' are not a list or a tuple.".format(c)) + if len(c) not in [2, 3]: + raise ValidationException("'{}' is not a valid list or tuple of coordinates, " + "because we expect either 2 or 3 elements.".format(c)) + if len(c) == 2: + x, z = [validateInt(i) for i in c] + y = 64 + else: + x, y, z = [validateInt(i) for i in c] + return (x, y, z) + + def make_dictValidator(keyvalidator, valuevalidator): """Compose and return a dict validator -- a validator that validates each key and value in a dictionary. diff --git a/overviewer_core/tileset.py b/overviewer_core/tileset.py index 4128e5a..a2884cb 100644 --- a/overviewer_core/tileset.py +++ b/overviewer_core/tileset.py @@ -589,7 +589,9 @@ class TileSet(object): imgextension=self.imgextension, isOverlay=isOverlay, poititle=self.options.get("poititle"), - showlocationmarker=self.options.get("showlocationmarker") + showlocationmarker=self.options.get("showlocationmarker"), + center=(self.options.get("center") or self.options.get("spawn") + or [0, 64, 0]) ) d['maxZoom'] = self.options.get('maxzoom', self.treedepth) if d['maxZoom'] < 0: