def encode( self, chunk: "Chunk", palette: AnyNDArray, max_world_version: Tuple[str, Union[int, Tuple[int, int, int]]], box: SelectionBox = None, ) -> SchematicChunk: entities = [] for e in chunk.entities: if e.location in box: entities.append( self._encode_entity(e, self._entity_id_type, self._entity_coord_type).value) block_entities = [] for e in chunk.block_entities: if e.location in box: block_entities.append( self._encode_block_entity( e, self._block_entity_id_type, self._block_entity_coord_type).value) slices = box.create_moved_box((chunk.cx * 16, 0, chunk.cz * 16), subtract=True).slice blocks_merged = palette[chunk.blocks[slices]] return SchematicChunk( box, blocks_merged[:, :, :, 0].astype(numpy.uint16), blocks_merged[:, :, :, 1].astype(numpy.uint8), block_entities, entities, )
def encode( self, chunk: "Chunk", palette: AnyNDArray, max_world_version: VersionIdentifierType, box: SelectionBox, ) -> MCStructureChunk: """ Take a version-specific chunk and encode it to raw data for the format to store. :param chunk: The already translated version-specfic chunk to encode. :param palette: The block_palette the ids in the chunk correspond to. :type palette: numpy.ndarray[Block] :param max_world_version: The key to use to find the encoder. :param box: The volume of the chunk to pack. :return: Raw data to be stored by the Format. """ entities = [] for e in chunk.entities: if e.location in box: entities.append( self._encode_entity(e, self._entity_id_type, self._entity_coord_type).value) block_entities = [] for e in chunk.block_entities: if e.location in box: block_entities.append( self._encode_block_entity( e, self._block_entity_id_type, self._block_entity_coord_type).value) slices = box.create_moved_box((chunk.cx * 16, 0, chunk.cz * 16), subtract=True).slice out_palette = numpy.empty(palette.shape, dtype=object) for index, block_layers in enumerate(palette): blocks_out = [] for version, block in block_layers: block = amulet_nbt.TAG_Compound({ "name": amulet_nbt.TAG_String( f"{block.namespace}:{block.base_name}"), "states": amulet_nbt.TAG_Compound(block.properties), }) if version: block["version"] = amulet_nbt.TAG_Int(version) blocks_out.append(block) out_palette[index] = blocks_out return MCStructureChunk( box, numpy.asarray(chunk.blocks[slices]), out_palette, block_entities, entities, )
def encode( self, chunk: "Chunk", palette: AnyNDArray, max_world_version: Tuple[str, Union[int, Tuple[int, int, int]]], box: SelectionBox = None, ) -> MCStructureChunk: entities = [] for e in chunk.entities: if e.location in box: entities.append( self._encode_entity( e, self._entity_id_type, self._entity_coord_type ).value ) block_entities = [] for e in chunk.block_entities: if e.location in box: block_entities.append( self._encode_block_entity( e, self._block_entity_id_type, self._block_entity_coord_type ).value ) slices = box.create_moved_box( (chunk.cx * 16, 0, chunk.cz * 16), subtract=True ).slice out_palette = numpy.empty(palette.shape, dtype=object) for index, block_layers in enumerate(palette): blocks_out = [] for version, block in block_layers: block = amulet_nbt.TAG_Compound( { "name": amulet_nbt.TAG_String( f"{block.namespace}:{block.base_name}" ), "states": amulet_nbt.TAG_Compound(block.properties), } ) if version: block["version"] = amulet_nbt.TAG_Int(version) blocks_out.append(block) out_palette[index] = blocks_out return MCStructureChunk( box, chunk.blocks[slices], out_palette, block_entities, entities )
def encode( self, chunk: "Chunk", palette: AnyNDArray, max_world_version: VersionIdentifierType, box: SelectionBox, ) -> SchematicChunk: """ Take a version-specific chunk and encode it to raw data for the format to store. :param chunk: The already translated version-specfic chunk to encode. :param palette: The block_palette the ids in the chunk correspond to. :type palette: numpy.ndarray[Block] :param max_world_version: The key to use to find the encoder. :param box: The volume of the chunk to pack. :return: Raw data to be stored by the Format. """ entities = [] for e in chunk.entities: if e.location in box: entities.append( self._encode_entity( e, self._entity_id_type, self._entity_coord_type ).value ) block_entities = [] for e in chunk.block_entities: if e.location in box: block_entities.append( self._encode_block_entity( e, self._block_entity_id_type, self._block_entity_coord_type ).value ) slices = box.create_moved_box( (chunk.cx * 16, 0, chunk.cz * 16), subtract=True ).slice blocks_merged = palette[chunk.blocks[slices]] return SchematicChunk( box, blocks_merged[:, :, :, 0].astype(numpy.uint16), blocks_merged[:, :, :, 1].astype(numpy.uint8), block_entities, entities, )