2016-07-09 17:21:20 -05:00

85 lines
2.8 KiB
Python

from mc import *
from ast import literal_eval
import os
import sys
import re
import mcpi.nbt as nbt
from struct import pack
from vehicle import getLoadPath
def load(filename):
with open(filename) as f:
data = ''.join(f.readlines())
result = re.search("=\\s*(.*)",data)
if result is None:
raise ValueError
# Check to ensure only function called is Block() by getting literal_eval to
# raise an exception when "Block" is removed and the result isn't a literal.
# This SHOULD make the eval call safe, though USE AT YOUR OWN RISK. Ideally,
# one would walk the ast parse tree and use a whitelist.
literal_eval(result.group(1).replace("Block",""))
return eval(result.group(1))
def toSchematic(vehicle):
x0 = min(x for (x,y,z) in vehicle)
y0 = min(y for (x,y,z) in vehicle)
z0 = min(z for (x,y,z) in vehicle)
x1 = max(x for (x,y,z) in vehicle)
y1 = max(y for (x,y,z) in vehicle)
z1 = max(z for (x,y,z) in vehicle)
schematic = nbt.NBTFile()
schematic.name = "Schematic"
schematic.tags.append(nbt.TAG_Short(name="Width", value = x1-x0+1))
schematic.tags.append(nbt.TAG_Short(name="Height", value = y1-y0+1))
schematic.tags.append(nbt.TAG_Short(name="Length", value = z1-z0+1))
schematic.tags.append(nbt.TAG_String(name="Materials", value="Alpha"))
ids = b''
metas = b''
for y in range(y0,y1+1):
for z in range(z0,z1+1):
for x in range(x0,x1+1):
try:
b = vehicle[(x,y,z)]
except:
b = Block(0)
ids += pack("B", b.id)
metas += pack("B", b.data)
blocks = nbt.TAG_Byte_Array(name="Blocks")
blocks.value = ids
schematic.tags.append(blocks)
data = nbt.TAG_Byte_Array(name="Data")
data.value = metas
schematic.tags.append(data)
schematic.tags.append(nbt.TAG_List(name="Entities", type=nbt.TAG_Compound))
schematic.tags.append(nbt.TAG_List(name="TileEntities", type=nbt.TAG_Compound))
return schematic
def vehicleToSchematic(vehiclePath, schematicPath):
angle,highWater,vehicle = load(vehiclePath)
nbt = toSchematic(vehicle)
nbt.write_file(schematicPath)
if __name__ == '__main__':
directory = os.path.join(os.path.dirname(sys.argv[0]),"vehicles")
if len(sys.argv) >= 2:
if sys.argv[1].endswith(".py"):
name = directory + "/" + sys.argv[1]
else:
name = directory + "/" + sys.argv[1] + ".py"
else:
name = getLoadPath(directory, "py")
out = name
if out.endswith(".py"):
out = name[:-2] + "schematic"
else:
out += ".schematic"
vehicleToSchematic(name, out)