Add metadata

master
Novatux 2014-03-04 14:04:53 +01:00
parent 56b0932509
commit 1d81526834
4 changed files with 91 additions and 24 deletions

View File

@ -4,6 +4,7 @@ import nbt
from io import BytesIO
import sqlite3
from serialize import *
from itemstack import *
class MCMap:
@ -175,6 +176,19 @@ class MTBlock:
content[i], param2[i] = conversion_table[blocks[i]][data[i]]
param1[i] = max(blocklight[i], skylight[i])|(blocklight[i]<<4)
for te in mcblock.tile_entites:
id = te["id"]
x, y, z = te["x"], te["y"], te["z"]
index = ((y&0xf)<<8)|((z&0xf)<<4)|(x&0xf)
f = te_convert.get(id.lower(), lambda arg: (None, None, None)) # Do nothing if not found
block, p2, meta = f(te)
if block != None:
blocks[index] = block
if p2 != None:
param2[index] = p2
if meta != None:
self.metadata[(x&0xf, y&0xf, z&0xf)] = meta
def save(self):
os = BytesIO()
writeU8(os, 25) # Version
@ -228,8 +242,17 @@ class MTBlock:
os.write(zlib.compress(cbuffer.getvalue()))
# Nodemeta
meta = self.metadata
cbuffer = BytesIO()
writeU8(cbuffer, 0) # TODO: actually store the meta
writeU8(cbuffer, 1) # Version
writeU16(cbuffer, len(meta))
for pos, data in meta.items():
writeU16(cbuffer, (pos[2]<<16)|(pos[1]<<8)|pos[0])
writeU32(cbuffer, len(data[0]))
for name, val in data[0].items():
writeString(cbuffer, name)
writeLongString(cbuffer, str(val))
serialize_inv(cbuffer, data[1])
os.write(zlib.compress(cbuffer.getvalue()))
# Static objects

34
itemstack.py Normal file
View File

@ -0,0 +1,34 @@
class MCItemStack:
def __init__(self):
pass
class MTItemStack:
def __init__(self):
pass
def fromMCItemStack(self, mcstack):
pass
def empty(self):
return True
def serialize(self, os):
pass
def serialize_inv_list(os, inv_list):
os.write(bytes("Width "+str(inv_list[0])+"\n", "utf-8"))
for item in inv_list[1]:
if item.empty():
os.write(bytes("Empty", "utf-8"))
else:
os.write(bytes("Item ", "uft-8"))
item.serialize(os)
os.write(bytes("\n", "utf-8"))
os.write(bytes("EndInventoryList\n", "utf-8"))
def serialize_inv(os, inv):
for name, inv_list in inv.items():
os.write(bytes("List "+name+" "+str(len(inv_list[1]))+"\n", "utf-8"))
serialize_inv_list(os, inv_list)
os.write(bytes("EndInventory\n", "utf-8"))

View File

@ -16,6 +16,11 @@ def writeString(os, s):
writeU16(os, len(b))
os.write(b)
def writeLongString(os, s):
b = bytes(s, "utf-8")
writeU32(os, len(b))
os.write(b)
def bytesToInt(b):
s = 0
for x in b:

View File

@ -1,11 +1,13 @@
from itemstack import *
def convert_chest(te):
meta = """{fields={infotext="Chest",\
formspec="size[8,9]\
list[current_name;main;0,0;8,4;]\
list[current_player;main;0,5;8,4;]"},\
inventory={main=\
{"","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}}}"""
return None, None, meta
formspec = "size[8,9]\
list[current_name;main;0,0;8,4;]\
list[current_player;main;0,5;8,4;]"
fields = {"infotext": "Chest",
"formspec": formspec}
inventory = {"main": (0, [MTItemStack()]*32)}
return None, None, (fields, inventory)
def escape(s):
s2 = ""
@ -27,17 +29,21 @@ def convert_furnace(te):
fuel_time = 0
fuel_totaltime = 0
infotext = "Furnace out of fuel"
meta = '''{fields={src_totaltime="'''+str(src_totaltime)+'''",\
src_time="'''+str(src_time)+'''",fuel_time="'''+str(fuel_time)+'''",\
fuel_totaltime="'''+str(fuel_totaltime)'''",\
formspec="size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]\
list[current_name;fuel;2,3;1,1;]\
list[current_name;src;2,1;1,1;]\
list[current_name;dst;5,1;2,2;]\
list[current_player;main;0,5;8,4;]",\
infotext="'''+infotext+'''"},\
inventory={fuel={""},dst={"","","",""},src={""}}}'''
return None, None, meta
formspec = "size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]\
list[current_name;fuel;2,3;1,1;]\
list[current_name;src;2,1;1,1;]\
list[current_name;dst;5,1;2,2;]\
list[current_player;main;0,5;8,4;]"
fields = {"infotext": infotext,
"formspec": formspec,
"src_totaltime": src_totaltime,
"src_time": src_time,
"fuel_totaltime": fuel_totaltime,
"fuel_time": fuel_time}
inventory = {"fuel": (0, [MTItemStack()]),
"src": (0, [MTItemStack()]),
"dst": (0, [MTItemStack()]*4)}
return None, None, (fields, inventory)
def convert_sign(te):
t = ""
@ -47,11 +53,10 @@ def convert_sign(te):
t += line
t += " "
t = t.strip()
text = escape(t)
meta = '''{fields={infotext="\\"'''+text+'''\\"",text="'''+text+'''",\
formspec="field[text;;${text}]"},\
inventory={}}'''
return None, None, meta
fields = {"infotext": '"'+t+'"',
"text": t,
"formspec": "field[text;;${text}]"}
return None, None, (fields, {})
te_convert = {"chest": convert_chest,
"sign": convert_sign,