update minetestmapper so it can read the database also
authorJacobF <queatz@gmail.com>
Tue, 6 Sep 2011 19:11:46 +0000 (15:11 -0400)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 16 Sep 2011 15:59:33 +0000 (18:59 +0300)
util/minetestmapper.py

index e13a1bdc34be194e51f138f60b6dab1e0ac90453..c7ec0774ecae81b606ab8009b12cc1fad16c0c14 100755 (executable)
@@ -85,6 +85,13 @@ def int_to_hex4(i):
         return "%04X" % i
 
 
+def getBlockAsInteger(p):
+    return p[2]*16777216 + p[1]*4096 + p[0]
+
+def getIntegerAsBlock(i):
+    return i%4096, int(i/4096)%4096, int(i/16777216)%4096
+
+
 def limit(i, l, h):
     if(i > h):
         i = h
@@ -169,6 +176,30 @@ zlist = []
 
 # List all sectors to memory and calculate the width and heigth of the
 # resulting picture.
+
+conn = None
+cur = None
+if os.path.exists(path + "map.sqlite"):
+    import sqlite3
+    conn = sqlite3.connect(path + "map.sqlite")
+    cur = conn.cursor()
+    
+    cur.execute("SELECT `pos` FROM `blocks`")
+    while True:
+        r = cur.fetchone()
+        if not r:
+            break
+        
+        x, y, z = getIntegerAsBlock    (r[0])
+        
+        if x < sector_xmin or x > sector_xmax:
+            continue
+        if z < sector_zmin or z > sector_zmax:
+            continue
+        
+        xlist.append(x)
+        zlist.append(z)
+
 if os.path.exists(path + "sectors2"):
     for filename in os.listdir(path + "sectors2"):
         for filename2 in os.listdir(path + "sectors2/" + filename):
@@ -305,6 +336,16 @@ for n in range(len(xlist)):
 
     sectortype = ""
 
+    if cur:
+        ps = getBlockAsInteger((xpos, 0, zpos))
+        cur.execute("SELECT `pos` FROM `blocks` WHERE `pos`>=? AND `pos`<?", (ps, ps + 4096))
+        while True:
+            r = cur.fetchone()
+            if not r:
+                break
+            pos = getIntegerAsBlock(r[0])[1]
+            ylist.append(pos)
+            sectortype = "sqlite"
     try:
         for filename in os.listdir(path + "sectors/" + sector1):
             if(filename != "meta"):
@@ -316,7 +357,7 @@ for n in range(len(xlist)):
     except OSError:
         pass
 
-    if sectortype != "old":
+    if sectortype == "":
         try:
             for filename in os.listdir(path + "sectors2/" + sector2):
                 if(filename != "meta"):
@@ -348,10 +389,21 @@ for n in range(len(xlist)):
         yhex = int_to_hex4(ypos)
 
         filename = ""
-        if sectortype == "old":
-            filename = path + "sectors/" + sector1 + "/" + yhex.lower()
+        if sectortype == "sqlite":
+            ps = getBlockAsInteger((xpos, ypos, zpos))
+            cur.execute("SELECT `data` FROM `blocks` WHERE `pos`==? LIMIT 1", (ps,))
+            r = cur.fetchone()
+            if not r:
+                continue
+            filename = "mtm_tmp"
+            f = file(filename, 'wb')
+            f.write(r[0])
+            f.close()
         else:
-            filename = path + "sectors2/" + sector2 + "/" + yhex.lower()
+            if sectortype == "old":
+                filename = path + "sectors/" + sector1 + "/" + yhex.lower()
+            else:
+                filename = path + "sectors2/" + sector2 + "/" + yhex.lower()
 
         f = file(filename, "rb")
 
@@ -374,6 +426,16 @@ for n in range(len(xlist)):
 
     if len(pixellist) > 0:
         for (ypos, filename) in ylist2:
+            ps = getBlockAsInteger((xpos, ypos, zpos))
+            cur.execute("SELECT `data` FROM `blocks` WHERE `pos`==? LIMIT 1", (ps,))
+            r = cur.fetchone()
+            if not r:
+                continue
+            filename = "mtm_tmp"
+            f = file(filename, 'wb')
+            f.write(r[0])
+            f.close()
+            
             f = file(filename, "rb")
 
             version = ord(f.read(1))
@@ -495,5 +557,8 @@ if drawplayers:
     except OSError:
         pass
 
+if os.path.isfile("mtm_tmp"):
+    os.remove("mtm_tmp")
+
 print "Saving"
 im.save(output)