world: fix for chunk parsing for 1.14
If there's missing light data, just make up some with an empty array.
This commit is contained in:
@@ -1233,7 +1233,7 @@ class RegionSet(object):
|
|||||||
raise ChunkDoesntExist("Chunk %s,%s doesn't exist" % (x,z))
|
raise ChunkDoesntExist("Chunk %s,%s doesn't exist" % (x,z))
|
||||||
|
|
||||||
# Turn the Biomes array into a 16x16 numpy arra
|
# Turn the Biomes array into a 16x16 numpy arra
|
||||||
if 'Biomes' in chunk_data:
|
if 'Biomes' in chunk_data and len(chunk_data['Biomes']) > 0:
|
||||||
biomes = chunk_data['Biomes']
|
biomes = chunk_data['Biomes']
|
||||||
if isinstance(biomes, str):
|
if isinstance(biomes, str):
|
||||||
biomes = numpy.frombuffer(biomes, dtype=numpy.uint8)
|
biomes = numpy.frombuffer(biomes, dtype=numpy.uint8)
|
||||||
@@ -1241,7 +1241,9 @@ class RegionSet(object):
|
|||||||
biomes = numpy.asarray(biomes)
|
biomes = numpy.asarray(biomes)
|
||||||
biomes = biomes.reshape((16,16))
|
biomes = biomes.reshape((16,16))
|
||||||
else:
|
else:
|
||||||
# worlds converted by Jeb's program may be missing the Biomes key
|
# Worlds converted by Jeb's program may be missing the Biomes key.
|
||||||
|
# Additionally, 19w09a worlds have an empty array as biomes key
|
||||||
|
# in some cases.
|
||||||
biomes = numpy.zeros((16, 16), dtype=numpy.uint8)
|
biomes = numpy.zeros((16, 16), dtype=numpy.uint8)
|
||||||
chunk_data['Biomes'] = biomes
|
chunk_data['Biomes'] = biomes
|
||||||
|
|
||||||
@@ -1251,8 +1253,11 @@ class RegionSet(object):
|
|||||||
# Turn the skylight array into a 16x16x16 matrix. The array comes
|
# Turn the skylight array into a 16x16x16 matrix. The array comes
|
||||||
# packed 2 elements per byte, so we need to expand it.
|
# packed 2 elements per byte, so we need to expand it.
|
||||||
try:
|
try:
|
||||||
skylight = numpy.frombuffer(section['SkyLight'], dtype=numpy.uint8)
|
if 'SkyLight' in section:
|
||||||
skylight = skylight.reshape((16,16,8))
|
skylight = numpy.frombuffer(section['SkyLight'], dtype=numpy.uint8)
|
||||||
|
skylight = skylight.reshape((16,16,8))
|
||||||
|
else: # Special case introduced with 1.14
|
||||||
|
skylight = numpy.zeros((16,16,8), dtype=numpy.uint8)
|
||||||
skylight_expanded = numpy.empty((16,16,16), dtype=numpy.uint8)
|
skylight_expanded = numpy.empty((16,16,16), dtype=numpy.uint8)
|
||||||
skylight_expanded[:,:,::2] = skylight & 0x0F
|
skylight_expanded[:,:,::2] = skylight & 0x0F
|
||||||
skylight_expanded[:,:,1::2] = (skylight & 0xF0) >> 4
|
skylight_expanded[:,:,1::2] = (skylight & 0xF0) >> 4
|
||||||
@@ -1260,8 +1265,11 @@ class RegionSet(object):
|
|||||||
section['SkyLight'] = skylight_expanded
|
section['SkyLight'] = skylight_expanded
|
||||||
|
|
||||||
# Turn the BlockLight array into a 16x16x16 matrix, same as SkyLight
|
# Turn the BlockLight array into a 16x16x16 matrix, same as SkyLight
|
||||||
blocklight = numpy.frombuffer(section['BlockLight'], dtype=numpy.uint8)
|
if 'BlockLight' in section:
|
||||||
blocklight = blocklight.reshape((16,16,8))
|
blocklight = numpy.frombuffer(section['BlockLight'], dtype=numpy.uint8)
|
||||||
|
blocklight = blocklight.reshape((16,16,8))
|
||||||
|
else: # Special case introduced with 1.14
|
||||||
|
blocklight = numpy.zeros((16,16,8), dtype=numpy.uint8)
|
||||||
blocklight_expanded = numpy.empty((16,16,16), dtype=numpy.uint8)
|
blocklight_expanded = numpy.empty((16,16,16), dtype=numpy.uint8)
|
||||||
blocklight_expanded[:,:,::2] = blocklight & 0x0F
|
blocklight_expanded[:,:,::2] = blocklight & 0x0F
|
||||||
blocklight_expanded[:,:,1::2] = (blocklight & 0xF0) >> 4
|
blocklight_expanded[:,:,1::2] = (blocklight & 0xF0) >> 4
|
||||||
@@ -1270,8 +1278,11 @@ class RegionSet(object):
|
|||||||
|
|
||||||
if 'Palette' in section:
|
if 'Palette' in section:
|
||||||
(blocks, data) = self._get_blockdata_v113(section, unrecognized_block_types)
|
(blocks, data) = self._get_blockdata_v113(section, unrecognized_block_types)
|
||||||
else:
|
elif 'Data' in section:
|
||||||
(blocks, data) = self._get_blockdata_v112(section)
|
(blocks, data) = self._get_blockdata_v112(section)
|
||||||
|
else: # Special case introduced with 1.14
|
||||||
|
blocks = numpy.zeros((16,16,16), dtype=numpy.uint16)
|
||||||
|
data = numpy.zeros((16,16,16), dtype=numpy.uint8)
|
||||||
(section['Blocks'], section['Data']) = (blocks, data)
|
(section['Blocks'], section['Data']) = (blocks, data)
|
||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
|||||||
Reference in New Issue
Block a user