* support for content types extension in minetestmapper

This commit is contained in:
Wolfgang Fellger 2011-07-30 20:35:55 +02:00 committed by Nils Dagsson Moskopp
parent 96bee29e35
commit edbcf7c039
2 changed files with 114 additions and 91 deletions

@ -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]