Add metadata
This commit is contained in:
parent
56b0932509
commit
1d81526834
25
block.py
25
block.py
@ -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
34
itemstack.py
Normal 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"))
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user