* support for content types extension in minetestmapper
parent
96bee29e35
commit
edbcf7c039
|
@ -1,21 +1,26 @@
|
||||||
0 128 128 128
|
0 128 128 128 # CONTENT_STONE
|
||||||
1 107 134 51
|
800 107 134 51 # CONTENT_GRASS
|
||||||
2 39 66 106
|
2 39 66 106 # CONTENT_WATER
|
||||||
3 255 255 0
|
3 255 255 0 # CONTENT_TORCH
|
||||||
4 86 58 31
|
801 86 58 31 # CONTENT_TREE
|
||||||
5 48 95 8
|
802 48 95 8 # CONTENT_LEAVES
|
||||||
6 102 129 38
|
803 102 129 38 # CONTENT_GRASS_FOOTSTEPS
|
||||||
7 178 178 0
|
804 178 178 0 # CONTENT_MESE
|
||||||
8 101 84 36
|
805 101 84 36 # CONTENT_MUD
|
||||||
9 39 66 106
|
9 39 66 106 # CONTENT_WATERSOURCE
|
||||||
12 104 78 42
|
808 104 78 42 # CONTENT_WOOD
|
||||||
13 210 194 156
|
809 210 194 156 # CONTENT_SAND
|
||||||
14 117 86 41
|
e 117 86 41 # CONTENT_SIGN_WALL
|
||||||
15 128 79 0
|
f 128 79 0 # CONTENT_CHEST
|
||||||
16 118 118 118
|
10 118 118 118 # CONTENT_FURNACE
|
||||||
18 123 123 123
|
80a 123 123 123 # CONTENT_COBBLE
|
||||||
19 199 199 199
|
80b 199 199 199 # CONTENT_STEEL
|
||||||
20 183 183 222
|
80c 183 183 222 # CONENT_GLASS
|
||||||
21 103 78 42
|
15 103 78 42 # CONTENT_FENCE
|
||||||
22 108 138 108
|
80d 219 202 178 # CONTENT_MOSSYCOBBLE
|
||||||
23 90 90 90
|
80e 78 154 6 # CONTENT_GRAVEL
|
||||||
|
80f 204 0 0 # CONTENT_SANDSTONE
|
||||||
|
810 211 215 207 # CONTENT_CACTUS
|
||||||
|
811 170 50 25 # CONTENT_BRICK
|
||||||
|
812 104 78 42 # CONTENT_CLAY
|
||||||
|
813 58 105 18 # CONTENT_PAPYRUS
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
# 2011-06-02: j0gge: command line parameters, coordinates, players, ...
|
# 2011-06-02: j0gge: command line parameters, coordinates, players, ...
|
||||||
# 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n
|
# 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n
|
||||||
# to make it easily executable on Linux
|
# to make it easily executable on Linux
|
||||||
|
# 2011-07-30: WF: Support for content types extension, refactoring
|
||||||
|
|
||||||
# Requires Python Imaging Library: http://www.pythonware.com/products/pil/
|
# Requires Python Imaging Library: http://www.pythonware.com/products/pil/
|
||||||
|
|
||||||
|
@ -27,6 +28,33 @@ import string
|
||||||
import time
|
import time
|
||||||
import getopt
|
import getopt
|
||||||
import sys
|
import sys
|
||||||
|
import array
|
||||||
|
|
||||||
|
CONTENT_WATER = [2, 9]
|
||||||
|
|
||||||
|
TRANSLATION_TABLE = {
|
||||||
|
1: 0x800, # CONTENT_GRASS
|
||||||
|
4: 0x801, # CONTENT_TREE
|
||||||
|
5: 0x802, # CONTENT_LEAVES
|
||||||
|
6: 0x803, # CONTENT_GRASS_FOOTSTEPS
|
||||||
|
7: 0x804, # CONTENT_MESE
|
||||||
|
8: 0x805, # CONTENT_MUD
|
||||||
|
10: 0x806, # CONTENT_CLOUD
|
||||||
|
11: 0x807, # CONTENT_COALSTONE
|
||||||
|
12: 0x808, # CONTENT_WOOD
|
||||||
|
13: 0x809, # CONTENT_SAND
|
||||||
|
18: 0x80a, # CONTENT_COBBLE
|
||||||
|
19: 0x80b, # CONTENT_STEEL
|
||||||
|
20: 0x80c, # CONTENT_GLASS
|
||||||
|
22: 0x80d, # CONTENT_MOSSYCOBBLE
|
||||||
|
23: 0x80e, # CONTENT_GRAVEL
|
||||||
|
24: 0x80f, #CONTENT_SANDSTONE
|
||||||
|
25: 0x810, #CONTENT_CACTUS
|
||||||
|
26: 0x811, #CONTENT_BRICK
|
||||||
|
27: 0x812, #CONTENT_CLAY
|
||||||
|
28: 0x813, #CONTENT_PAPYRUS
|
||||||
|
29: 0x814 #CONTENT_BOOKSHELF
|
||||||
|
}
|
||||||
|
|
||||||
def hex_to_int(h):
|
def hex_to_int(h):
|
||||||
i = int(h, 16)
|
i = int(h, 16)
|
||||||
|
@ -70,7 +98,7 @@ except getopt.GetoptError, err:
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
path = "../world/"
|
path = "../world/"
|
||||||
output = "uloste.png"
|
output = "map.png"
|
||||||
border = 0
|
border = 0
|
||||||
scalecolor = "black"
|
scalecolor = "black"
|
||||||
bgcolor = "white"
|
bgcolor = "white"
|
||||||
|
@ -119,14 +147,14 @@ colors = {}
|
||||||
f = file("colors.txt")
|
f = file("colors.txt")
|
||||||
for line in f:
|
for line in f:
|
||||||
values = string.split(line)
|
values = string.split(line)
|
||||||
colors[int(values[0])] = (int(values[1]), int(values[2]), int(values[3]))
|
colors[int(values[0], 16)] = (int(values[1]), int(values[2]), int(values[3]))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
xlist = []
|
xlist = []
|
||||||
zlist = []
|
zlist = []
|
||||||
|
|
||||||
# List all sectors to memory and calculate the width and heigth of the resulting picture.
|
# List all sectors to memory and calculate the width and heigth of the resulting picture.
|
||||||
try:
|
if os.path.exists(path + "sectors2"):
|
||||||
for filename in os.listdir(path + "sectors2"):
|
for filename in os.listdir(path + "sectors2"):
|
||||||
for filename2 in os.listdir(path + "sectors2/" + filename):
|
for filename2 in os.listdir(path + "sectors2/" + filename):
|
||||||
x = hex_to_int(filename)
|
x = hex_to_int(filename)
|
||||||
|
@ -137,9 +165,8 @@ try:
|
||||||
continue
|
continue
|
||||||
xlist.append(x)
|
xlist.append(x)
|
||||||
zlist.append(z)
|
zlist.append(z)
|
||||||
except OSError:
|
|
||||||
pass
|
if os.path.exists(path + "sectors"):
|
||||||
try:
|
|
||||||
for filename in os.listdir(path + "sectors"):
|
for filename in os.listdir(path + "sectors"):
|
||||||
x = hex4_to_int(filename[:4])
|
x = hex4_to_int(filename[:4])
|
||||||
z = hex4_to_int(filename[-4:])
|
z = hex4_to_int(filename[-4:])
|
||||||
|
@ -149,8 +176,6 @@ try:
|
||||||
continue
|
continue
|
||||||
xlist.append(x)
|
xlist.append(x)
|
||||||
zlist.append(z)
|
zlist.append(z)
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
minx = min(xlist)
|
minx = min(xlist)
|
||||||
minz = min(zlist)
|
minz = min(zlist)
|
||||||
|
@ -171,7 +196,54 @@ stuff = {}
|
||||||
starttime = time.time()
|
starttime = time.time()
|
||||||
|
|
||||||
def data_is_air(d):
|
def data_is_air(d):
|
||||||
return (d == 254 or d == 126)
|
return d in [126, 127, 254]
|
||||||
|
|
||||||
|
def read_blocknum(mapdata, version, datapos):
|
||||||
|
if version == 20:
|
||||||
|
if mapdata[datapos] < 0x80:
|
||||||
|
return mapdata[datapos]
|
||||||
|
else:
|
||||||
|
return (mapdata[datapos] << 4) | (mapdata[datapos + 0x2000] >> 4)
|
||||||
|
elif 16 <= version < 20:
|
||||||
|
return TRANSLATION_TABLE.get(mapdata[datapos], mapdata[datapos])
|
||||||
|
else:
|
||||||
|
raise Exception("Unsupported map format: " + str(version))
|
||||||
|
|
||||||
|
def read_mapdata(f, version, pixellist, water):
|
||||||
|
global stuff # oh my :-)
|
||||||
|
|
||||||
|
dec_o = zlib.decompressobj()
|
||||||
|
try:
|
||||||
|
mapdata = array.array("B", dec_o.decompress(f.read()))
|
||||||
|
except:
|
||||||
|
mapdata = []
|
||||||
|
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
if(len(mapdata) < 4096):
|
||||||
|
print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata))
|
||||||
|
else:
|
||||||
|
chunkxpos = xpos * 16
|
||||||
|
chunkypos = ypos * 16
|
||||||
|
chunkzpos = zpos * 16
|
||||||
|
blocknum = 0
|
||||||
|
datapos = 0
|
||||||
|
for (x, z) in reversed(pixellist):
|
||||||
|
for y in reversed(range(16)):
|
||||||
|
datapos = x + y * 16 + z * 256
|
||||||
|
blocknum = read_blocknum(mapdata, version, datapos)
|
||||||
|
if not data_is_air(blocknum) and blocknum in colors:
|
||||||
|
if blocknum in CONTENT_WATER:
|
||||||
|
water[(x, z)] += 1
|
||||||
|
# Add dummy stuff for drawing sea without seabed
|
||||||
|
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)])
|
||||||
|
else:
|
||||||
|
pixellist.remove((x, z))
|
||||||
|
# Memorize information on the type and height of the block and for drawing the picture.
|
||||||
|
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)])
|
||||||
|
break
|
||||||
|
elif not data_is_air(blocknum) and blocknum not in colors:
|
||||||
|
print "strange block: %s/%s/%s x: %d y: %d z: %d block id: %x" % (xhex, zhex, yhex, x, y, z, blocknum)
|
||||||
|
|
||||||
# Go through all sectors.
|
# Go through all sectors.
|
||||||
for n in range(len(xlist)):
|
for n in range(len(xlist)):
|
||||||
|
@ -238,6 +310,7 @@ for n in range(len(xlist)):
|
||||||
|
|
||||||
ylist.sort()
|
ylist.sort()
|
||||||
|
|
||||||
|
|
||||||
# Make a list of pixels of the sector that are to be looked for.
|
# Make a list of pixels of the sector that are to be looked for.
|
||||||
pixellist = []
|
pixellist = []
|
||||||
water = {}
|
water = {}
|
||||||
|
@ -260,7 +333,8 @@ for n in range(len(xlist)):
|
||||||
|
|
||||||
f = file(filename, "rb")
|
f = file(filename, "rb")
|
||||||
|
|
||||||
version = f.read(1)
|
# Let's just memorize these even though it's not really necessary.
|
||||||
|
version = ord(f.read(1))
|
||||||
flags = f.read(1)
|
flags = f.read(1)
|
||||||
|
|
||||||
# Checking day and night differs -flag
|
# Checking day and night differs -flag
|
||||||
|
@ -269,35 +343,7 @@ for n in range(len(xlist)):
|
||||||
f.close()
|
f.close()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
dec_o = zlib.decompressobj()
|
read_mapdata(f, version, pixellist, water)
|
||||||
try:
|
|
||||||
mapdata = dec_o.decompress(f.read())
|
|
||||||
except:
|
|
||||||
mapdata = []
|
|
||||||
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if(len(mapdata) < 4096):
|
|
||||||
print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata))
|
|
||||||
else:
|
|
||||||
chunkxpos = xpos * 16
|
|
||||||
chunkypos = ypos * 16
|
|
||||||
chunkzpos = zpos * 16
|
|
||||||
for (x, z) in reversed(pixellist):
|
|
||||||
for y in reversed(range(16)):
|
|
||||||
datapos = x + y * 16 + z * 256
|
|
||||||
if(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) in colors):
|
|
||||||
if(ord(mapdata[datapos]) == 2 or ord(mapdata[datapos]) == 9):
|
|
||||||
water[(x, z)] += 1
|
|
||||||
# Add dummy stuff for drawing sea without seabed
|
|
||||||
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)])
|
|
||||||
else:
|
|
||||||
pixellist.remove((x, z))
|
|
||||||
# Memorize information on the type and height of the block and for drawing the picture.
|
|
||||||
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)])
|
|
||||||
break
|
|
||||||
elif(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) not in colors):
|
|
||||||
print "strange block: " + xhex + "/" + zhex + "/" + yhex + " x: " + str(x) + " y: " + str(y) + " z: " + str(z) + " palikka: " + str(ord(mapdata[datapos]))
|
|
||||||
|
|
||||||
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis.
|
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis.
|
||||||
if(len(pixellist) == 0):
|
if(len(pixellist) == 0):
|
||||||
|
@ -307,38 +353,10 @@ for n in range(len(xlist)):
|
||||||
for (ypos, filename) in ylist2:
|
for (ypos, filename) in ylist2:
|
||||||
f = file(filename, "rb")
|
f = file(filename, "rb")
|
||||||
|
|
||||||
version = f.read(1)
|
version = ord(f.read(1))
|
||||||
flags = f.read(1)
|
flags = f.read(1)
|
||||||
|
|
||||||
dec_o = zlib.decompressobj()
|
|
||||||
try:
|
|
||||||
mapdata = dec_o.decompress(f.read())
|
|
||||||
except:
|
|
||||||
mapdata = []
|
|
||||||
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if(len(mapdata) < 4096):
|
read_mapdata(f, version, pixellist, water)
|
||||||
print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata))
|
|
||||||
else:
|
|
||||||
chunkxpos = xpos * 16
|
|
||||||
chunkypos = ypos * 16
|
|
||||||
chunkzpos = zpos * 16
|
|
||||||
for (x, z) in reversed(pixellist):
|
|
||||||
for y in reversed(range(16)):
|
|
||||||
datapos = x + y * 16 + z * 256
|
|
||||||
if(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) in colors):
|
|
||||||
if(ord(mapdata[datapos]) == 2 or ord(mapdata[datapos]) == 9):
|
|
||||||
water[(x, z)] += 1
|
|
||||||
# Add dummy stuff for drawing sea without seabed
|
|
||||||
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)])
|
|
||||||
else:
|
|
||||||
pixellist.remove((x, z))
|
|
||||||
# Memorize information on the type and height of the block and for drawing the picture.
|
|
||||||
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)])
|
|
||||||
break
|
|
||||||
elif(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) not in colors):
|
|
||||||
print "outo palikka: " + xhex + "/" + zhex + "/" + yhex + " x: " + str(x) + " y: " + str(y) + " z: " + str(z) + " palikka: " + str(ord(mapdata[datapos]))
|
|
||||||
|
|
||||||
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis.
|
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis.
|
||||||
if(len(pixellist) == 0):
|
if(len(pixellist) == 0):
|
||||||
|
@ -375,7 +393,7 @@ for (x, z) in stuff.iterkeys():
|
||||||
c1 = stuff[(x - 1, z)][1]
|
c1 = stuff[(x - 1, z)][1]
|
||||||
c2 = stuff[(x, z + 1)][1]
|
c2 = stuff[(x, z + 1)][1]
|
||||||
c = stuff[(x, z)][1]
|
c = stuff[(x, z)][1]
|
||||||
if c1 != 2 and c1 != 9 and c2 != 2 and c2 != 9 and c != 2 and c != 9:
|
if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and c not in CONTENT_WATER:
|
||||||
y1 = stuff[(x - 1, z)][0]
|
y1 = stuff[(x - 1, z)][0]
|
||||||
y2 = stuff[(x, z + 1)][0]
|
y2 = stuff[(x, z + 1)][0]
|
||||||
y = stuff[(x, z)][0]
|
y = stuff[(x, z)][0]
|
||||||
|
|
Loading…
Reference in New Issue