Use byte array instead of string (python 3.8 compatibility).

master
AndrejIT 2021-07-11 14:45:14 +03:00
parent f2c02285aa
commit 4f5ff0195d
8 changed files with 78 additions and 70 deletions

3
.gitignore vendored Executable file
View File

@ -0,0 +1,3 @@
*.pyc
*.bac
*.bak

0
LICENSE Normal file → Executable file
View File

0
README.md Normal file → Executable file
View File

View File

@ -27,9 +27,9 @@ sourcecursor = sourceconn.cursor()
ownchest = {}
ownsomething = {}
#owned_block_evidence = re.compile("protector:protect")
#owned_block_evidence = re.compile("default:chest_locked")
owned_block_evidence = re.compile("protector:protect|protector_mese:protect|default:chest_locked")
#owned_block_evidence = re.compile(b"protector:protect")
#owned_block_evidence = re.compile(b"default:chest_locked")
owned_block_evidence = re.compile(b"protector:protect|protector_mese:protect|default:chest_locked")

View File

@ -34,11 +34,11 @@ if(len(arguments) == 3 ):
#use compiled regular expression to filter blocks by block content. it is faster that checking "in array".
useful_block_evidence = re.compile(
#"default:cobble|"+"bones:bones|"+
"protector:protect|default:chest_locked|doors:door_steel|"+
"default:chest|default:torch|default:stonebrick|default:glass|default:obsidian_glass|"+
"default:ladder|default:rail|default:fence_wood"
)
#b"default:cobble|"+"bones:bones|"+
b"protector:protect|default:chest_locked|doors:door_steel|"+
b"default:chest|default:torch|default:stonebrick|default:glass|default:obsidian_glass|"+
b"default:ladder|default:rail|default:fence_wood"
)
sourceconn = sqlite3.connect(source)
sourcecursorXZ = sourceconn.cursor()
@ -61,7 +61,7 @@ for rowMinMax in sourcecursorXZ.execute(" SELECT "+
maxZ = rowMinMax[3]
width = maxZ - minZ
height = maxX - minX
image = Image.new("RGB", (width, height), (0,0,0,0))
draw = ImageDraw.Draw(image)
@ -93,7 +93,7 @@ for row in sourcecursor.execute(" SELECT "+
print "Do not fit to image:", row[0], row[1], row[2]
else:
impixel[ row[0] - minX, height - row[2] + minZ ] = (255, 255, 200)
sourceconn.close()

View File

@ -18,12 +18,12 @@ class MtBlockParser:
content_width = 2
params_width = 2
nodeDataRead = ''
nodeDataRead = bytearray()
arrayParam0 = None
arrayParam1 = None
arrayParam2 = None
nodeMetadataRead = ''
nodeMetadataRead = bytearray()
metadata_version = 1
metadata_count = None
arrayMetadataRead = None
@ -31,23 +31,28 @@ class MtBlockParser:
static_object_version = 0
static_object_count = None
objectsRead = ''
objectsRead = bytearray()
#TODO
timestamp = None
name_id_mapping_version = 0
num_name_id_mappings = None
nameIdMappingsRead = ''
nameIdMappingsRead = bytearray()
nameIdMappings = None
length_of_timer = 10
num_of_timers = None
timersRead = ''
timersRead = bytearray()
arrayTimerTimeout = None
arrayTimerElapsed = None
def __init__(self, blockBlob):
self.nodeDataRead = bytearray()
self.nodeMetadataRead = bytearray()
self.objectsRead = bytearray()
self.nameIdMappingsRead = bytearray()
self.arrayParam0 = {}
self.arrayParam1 = {}
self.arrayParam2 = {}
@ -92,15 +97,15 @@ class MtBlockParser:
print("Object version not supported!")
cursor+=1
self.static_object_count = struct.unpack('>H', blockBlob[cursor:cursor + 2])[0]
self.objectsRead+= blockBlob[cursor:cursor + 2]
self.objectsRead.extend(blockBlob[cursor:cursor + 2])
cursor+= 2
for i in range(0, self.static_object_count):
self.objectsRead+= blockBlob[cursor:cursor + 13]
self.objectsRead.extend(blockBlob[cursor:cursor + 13])
cursor+= 13
self.objectsRead+= blockBlob[cursor:cursor + 2]
self.objectsRead.extend(blockBlob[cursor:cursor + 2])
data_size = struct.unpack('>H', blockBlob[cursor:cursor + 2])[0]
cursor+= 2
self.objectsRead+= blockBlob[cursor:cursor + data_size]
self.objectsRead.extend(blockBlob[cursor:cursor + data_size])
cursor+= data_size
self.timestamp = struct.unpack('>I', blockBlob[cursor:cursor + 4])[0]
cursor+= 4
@ -108,24 +113,24 @@ class MtBlockParser:
print("Name-ID mapping version not supported!")
cursor+= 1
self.num_name_id_mappings = struct.unpack('>H', blockBlob[cursor:cursor + 2])[0]
self.nameIdMappingsRead+= blockBlob[cursor:cursor + 2]
self.nameIdMappingsRead.extend(blockBlob[cursor:cursor + 2])
cursor+= 2
for i in range(0, self.num_name_id_mappings):
self.nameIdMappingsRead+= blockBlob[cursor:cursor + 2]
self.nameIdMappingsRead.extend(blockBlob[cursor:cursor + 2])
cursor+= 2
self.nameIdMappingsRead+= blockBlob[cursor:cursor + 2]
self.nameIdMappingsRead.extend(blockBlob[cursor:cursor + 2])
data_size = struct.unpack('>H', blockBlob[cursor:cursor + 2])[0]
cursor+= 2
self.nameIdMappingsRead+= blockBlob[cursor:cursor + data_size]
self.nameIdMappingsRead.extend(blockBlob[cursor:cursor + data_size])
cursor+= data_size
if self.length_of_timer != struct.unpack('B', blockBlob[cursor:cursor + 1])[0]:
print("Length of timer not supported!")
cursor+= 1
self.num_of_timers = struct.unpack('>H', blockBlob[cursor:cursor + 2])[0]
self.timersRead+= blockBlob[cursor:cursor + 2]
self.timersRead.extend(blockBlob[cursor:cursor + 2])
cursor+= 2
for i in range(0, self.num_of_timers):
self.timersRead+= blockBlob[cursor:cursor + 10]
self.timersRead.extend(blockBlob[cursor:cursor + 10])
cursor+= 10
if self.length != cursor:
print("Parsed length is wrong!")
@ -147,24 +152,24 @@ class MtBlockParser:
def selfCompile(self):
blockBlob = ''
blockBlob+= struct.pack('B', self.version)
blockBlob+= struct.pack('B', self.flags)
blockBlob+= struct.pack('B', self.content_width)
blockBlob+= struct.pack('B', self.params_width)
blockBlob+= zlib.compress(self.nodeDataRead)
blockBlob+= zlib.compress(self.nodeMetadataRead)
blockBlob+= struct.pack('B', self.static_object_version)
blockBlob+= self.objectsRead
blockBlob+= struct.pack('>I', self.timestamp)
blockBlob+= struct.pack('B', self.name_id_mapping_version)
blockBlob+= self.nameIdMappingsRead
blockBlob+= struct.pack('B', self.length_of_timer)
blockBlob+= self.timersRead
blockBlob = bytearray()
blockBlob.extend(struct.pack('B', self.version))
blockBlob.extend(struct.pack('B', self.flags))
blockBlob.extend(struct.pack('B', self.content_width))
blockBlob.extend(struct.pack('B', self.params_width))
blockBlob.extend(zlib.compress(self.nodeDataRead))
blockBlob.extend(zlib.compress(self.nodeMetadataRead))
blockBlob.extend(struct.pack('B', self.static_object_version))
blockBlob.extend(self.objectsRead)
blockBlob.extend(struct.pack('>I', self.timestamp))
blockBlob.extend(struct.pack('B', self.name_id_mapping_version))
blockBlob.extend(self.nameIdMappingsRead)
blockBlob.extend(struct.pack('B', self.length_of_timer))
blockBlob.extend(self.timersRead)
return blockBlob
def nodeDataParse(self):
if self.nodeDataRead == None or self.nodeDataRead == '':
if self.nodeDataRead == None or self.nodeDataRead == bytearray():
print("No node data!")
return
if len(self.nodeDataRead) != 4096 * 4:
@ -181,13 +186,13 @@ class MtBlockParser:
cursor+= 1
def nodeDataCompile(self):
self.nodeDataRead = ''
self.nodeDataRead+= struct.pack('>%sH' % 4096, *self.arrayParam0.values())
self.nodeDataRead+= struct.pack('B' * 4096, *self.arrayParam1.values())
self.nodeDataRead+= struct.pack('B' * 4096, *self.arrayParam2.values())
self.nodeDataRead = bytearray()
self.nodeDataRead.extend(struct.pack('>%sH' % 4096, *self.arrayParam0.values()))
self.nodeDataRead.extend(struct.pack('B' * 4096, *self.arrayParam1.values()))
self.nodeDataRead.extend(struct.pack('B' * 4096, *self.arrayParam2.values()))
def nodeMetadataParse(self):
if self.nodeMetadataRead == None or self.nodeMetadataRead == '':
if self.nodeMetadataRead == None or self.nodeMetadataRead == bytearray():
print("No node metadata!")
return
length = len(self.nodeMetadataRead)
@ -232,18 +237,18 @@ class MtBlockParser:
print("Metadata length is wrong!")
def nodeMetadataCompile(self):
self.nodeMetadataRead = ''
self.nodeMetadataRead+= struct.pack('>B', self.metadata_version)
self.nodeMetadataRead+= struct.pack('>H', len(self.arrayMetadataRead))
self.nodeMetadataRead = bytearray()
self.nodeMetadataRead.extend(struct.pack('>B', self.metadata_version))
self.nodeMetadataRead.extend(struct.pack('>H', len(self.arrayMetadataRead)))
for position, Metadata in self.arrayMetadataRead.items():
self.nodeMetadataRead+= struct.pack('>H', position)
self.nodeMetadataRead+= struct.pack('>i', len(Metadata))
self.nodeMetadataRead.extend(struct.pack('>H', position))
self.nodeMetadataRead.extend(struct.pack('>i', len(Metadata)))
for key, val in Metadata.items():
self.nodeMetadataRead+= struct.pack('>H', len(key))
self.nodeMetadataRead+= str(key)
self.nodeMetadataRead+= struct.pack('>i', len(val))
self.nodeMetadataRead+= str(val)
self.nodeMetadataRead+= str(self.arrayMetadataReadInventory[position])
self.nodeMetadataRead.extend(struct.pack('>H', len(key)))
self.nodeMetadataRead.extend(str(key))
self.nodeMetadataRead.extend(struct.pack('>i', len(val)))
self.nodeMetadataRead.extend(str(val))
self.nodeMetadataRead.extend(str(self.arrayMetadataReadInventory[position]))
def objectsParse(self):
#TODO
@ -266,12 +271,12 @@ class MtBlockParser:
def nameIdMappingsCompile(self):
self.num_name_id_mappings = len(self.nameIdMappings)
self.nameIdMappingsRead = ''
self.nameIdMappingsRead+= struct.pack('>H', self.num_name_id_mappings)
self.nameIdMappingsRead = bytearray()
self.nameIdMappingsRead.extend(struct.pack('>H', self.num_name_id_mappings))
for mapping_id, mapping in self.nameIdMappings.items():
self.nameIdMappingsRead+= struct.pack('>H', mapping_id)
self.nameIdMappingsRead+= struct.pack('>H', len(mapping))
self.nameIdMappingsRead+= str(mapping)
self.nameIdMappingsRead.extend(struct.pack('>H', mapping_id))
self.nameIdMappingsRead.extend(struct.pack('>H', len(mapping)))
self.nameIdMappingsRead.extend(str(mapping))
def timersParse(self):
length = len(self.timersRead)
@ -290,9 +295,9 @@ class MtBlockParser:
def timersCompile(self):
self.num_of_timers = len(self.arrayTimerTimeout)
self.timersRead = ''
self.timersRead+= struct.pack('>H', self.num_of_timers)
self.timersRead = bytearray()
self.timersRead.extend(struct.pack('>H', self.num_of_timers))
for position, timeout in self.arrayTimerTimeout.items():
self.timersRead+= struct.pack('>H', position)
self.timersRead+= struct.pack('>i', timeout)
self.timersRead+= struct.pack('>i', self.arrayTimerElapsed[position])
self.timersRead.extend(struct.pack('>H', position))
self.timersRead.extend(struct.pack('>i', timeout))
self.timersRead.extend(struct.pack('>i', self.arrayTimerElapsed[position]))

0
recover.py Normal file → Executable file
View File

10
remap.py Normal file → Executable file
View File

@ -32,11 +32,11 @@ if(len(arguments) == 3 ):
#use compiled regular expression to filter blocks by block content. it is faster that checking "in array".
useful_block_evidence = re.compile(
"default:cobble|"+
"protector:protect|default:chest_locked|doors:door_steel|"+
"default:chest|default:torch|default:stonebrick|default:glass|default:obsidian_glass|"+
"default:ladder|default:rail|default:fence_wood|"+
"bones:bones"
b"default:cobble|"+
b"protector:protect|default:chest_locked|doors:door_steel|"+
b"default:chest|default:torch|default:stonebrick|default:glass|default:obsidian_glass|"+
b"default:ladder|default:rail|default:fence_wood|"+
b"bones:bones"
)
sourceconn = sqlite3.connect(source)