0

Display a spawn marker

This commit is contained in:
Andrew Chin
2012-03-11 17:59:29 -04:00
parent 9d97ff4e37
commit 729fcda964
6 changed files with 68 additions and 8 deletions

View File

@@ -406,6 +406,7 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
# only pass to the TileSet the options it really cares about
render['name'] = render_name # perhaps a hack. This is stored here for the asset manager
tileSetOpts = util.dict_subset(render, ["name", "imgformat", "renderchecks", "rerenderprob", "bgcolor", "imgquality", "optimizeimg", "rendermode", "worldname_orig", "title", "dimension", "changelist"])
tileSetOpts.update({"spawn": w.find_true_spawn()}) # TODO find a better way to do this
tset = tileset.TileSet(rset, assetMrg, tex, tileSetOpts, tileset_dir)
tilesets.append(tset)

View File

@@ -36,7 +36,12 @@ overviewer.collections = {
/**
* Hold the raw marker data for each tilest
*/
'markerInfo': {}
'markerInfo': {},
/**
* holds a reference to the spawn marker.
*/
'spawnMarker': null,
};
overviewer.classes = {

View File

@@ -63,6 +63,8 @@ overviewer.util = {
signs.registerEvents(signs);
}
var spawnmarker = new overviewer.views.SpawnIconView();
// Update coords on mousemove
google.maps.event.addListener(overviewer.map, 'mousemove', function (event) {
coordsdiv.updateCoords(event.latLng);
@@ -77,6 +79,7 @@ overviewer.util = {
overviewer.mapView.updateCurrentTileset();
compass.render();
spawnmarker.render();
// re-center on the last viewport
var currentWorldView = overviewer.mapModel.get("currentWorldView");

View File

@@ -359,3 +359,29 @@ overviewer.views.SignControlView = Backbone.View.extend({
},
});
/**
* SpawnIconView
*/
overviewer.views.SpawnIconView = Backbone.View.extend({
render: function() {
//
var curTileSet = overviewer.mapView.options.currentTileSet;
if (overviewer.collections.spawnMarker) {
overviewer.collections.spawnMarker.setMap(null);
overviewer.collections.spawnMarker = null;
}
var spawn = curTileSet.get("spawn");
if (spawn) {
overviewer.collections.spawnMarker = new google.maps.Marker({
'position': overviewer.util.fromWorldToLatLng(spawn[0],
spawn[1], spawn[2], overviewer.mapView.options.currentTileSet),
'map': overviewer.map,
'title': 'spawn',
'icon': overviewerConfig.CONST.image.spawnMarker,
'visible': false
});
overviewer.collections.spawnMarker.setVisible(true);
}
}
});

View File

@@ -518,6 +518,8 @@ class TileSet(object):
last_rendertime = self.max_chunk_mtime,
imgextension = self.imgextension,
)
if (self.regionset.get_type() == "overworld"):
d.update({"spawn": self.options.get("spawn")})
try:
d['north_direction'] = self.regionset.north_dir
except AttributeError:

View File

@@ -19,6 +19,8 @@ import os.path
from glob import glob
import logging
import hashlib
import time
import random
import numpy
@@ -91,8 +93,21 @@ class World(object):
if not os.path.exists(os.path.join(self.worlddir, "level.dat")):
raise ValueError("level.dat not found in %s" % self.worlddir)
# Hard-code this to only work with format version 19133, "Anvil"
data = nbt.load(os.path.join(self.worlddir, "level.dat"))[1]['Data']
# it seems that reading a level.dat file is unstable, particularly with respect
# to the spawnX,Y,Z variables. So we'll try a few times to get a good reading
# empirically, it seems that 0,50,0 is a "bad" reading
retrycount = 0
while (data['SpawnX'] == 0 and data['SpawnY'] == 50 and data['SpawnZ'] ==0 ):
logging.debug("bad level read, retrying")
time.sleep(random.random())
data = nbt.load(os.path.join(self.worlddir, "level.dat"))[1]['Data']
retrycount += 1
if retrycount > 10:
raise Exception("Failed to correctly read level.dat")
# Hard-code this to only work with format version 19133, "Anvil"
if not ('version' in data and data['version'] == 19133):
logging.critical("Sorry, This version of Minecraft-Overviewer only works with the 'Anvil' chunk format")
raise ValueError("World at %s is not compatible with Overviewer" % self.worlddir)
@@ -163,7 +178,7 @@ class World(object):
# location
## read spawn info from level.dat
data = self.data
data = self.leveldat
disp_spawnX = spawnX = data['SpawnX']
spawnY = data['SpawnY']
disp_spawnZ = spawnZ = data['SpawnZ']
@@ -175,24 +190,32 @@ class World(object):
## clamp spawnY to a sane value, in-chunk value
if spawnY < 0:
spawnY = 0
if spawnY > 127:
spawnY = 127
if spawnY > 255:
spawnY = 255
# Open up the chunk that the spawn is in
regionset = self.get_regionset(0)
regionset = self.get_regionset("overworld")
try:
chunk = regionset.get_chunk(chunkX, chunkZ)
except ChunkDoesntExist:
return (spawnX, spawnY, spawnZ)
def getBlock(y):
"This is stupid and slow but I don't care"
targetSection = spawnY//16
for section in chunk['Sections']:
if section['Y'] == targetSection:
blockArray = section['Blocks']
return blockArray[inChunkX, inChunkZ, y % 16]
blockArray = chunk['Blocks']
## The block for spawn *within* the chunk
inChunkX = spawnX - (chunkX*16)
inChunkZ = spawnZ - (chunkZ*16)
## find the first air block
while (blockArray[inChunkX, inChunkZ, spawnY] != 0) and spawnY < 127:
while (getBlock(spawnY) != 0) and spawnY < 256:
spawnY += 1
return spawnX, spawnY, spawnZ