amulet-core 1.9.19__py3-none-any.whl → 1.9.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of amulet-core might be problematic. Click here for more details.
- amulet/__init__.py +27 -27
- amulet/__pyinstaller/__init__.py +2 -2
- amulet/__pyinstaller/hook-amulet.py +4 -4
- amulet/_version.py +21 -21
- amulet/api/__init__.py +2 -2
- amulet/api/abstract_base_entity.py +128 -128
- amulet/api/block.py +630 -630
- amulet/api/block_entity.py +71 -71
- amulet/api/cache.py +107 -107
- amulet/api/chunk/__init__.py +6 -6
- amulet/api/chunk/biomes.py +207 -207
- amulet/api/chunk/block_entity_dict.py +175 -175
- amulet/api/chunk/blocks.py +46 -46
- amulet/api/chunk/chunk.py +389 -389
- amulet/api/chunk/entity_list.py +75 -75
- amulet/api/chunk/status.py +167 -167
- amulet/api/data_types/__init__.py +4 -4
- amulet/api/data_types/generic_types.py +4 -4
- amulet/api/data_types/operation_types.py +16 -16
- amulet/api/data_types/world_types.py +49 -49
- amulet/api/data_types/wrapper_types.py +71 -71
- amulet/api/entity.py +74 -74
- amulet/api/errors.py +119 -119
- amulet/api/history/__init__.py +36 -36
- amulet/api/history/base/__init__.py +3 -3
- amulet/api/history/base/base_history.py +26 -26
- amulet/api/history/base/history_manager.py +63 -63
- amulet/api/history/base/revision_manager.py +73 -73
- amulet/api/history/changeable.py +15 -15
- amulet/api/history/data_types.py +7 -7
- amulet/api/history/history_manager/__init__.py +3 -3
- amulet/api/history/history_manager/container.py +102 -102
- amulet/api/history/history_manager/database.py +279 -279
- amulet/api/history/history_manager/meta.py +93 -93
- amulet/api/history/history_manager/object.py +116 -116
- amulet/api/history/revision_manager/__init__.py +2 -2
- amulet/api/history/revision_manager/disk.py +33 -33
- amulet/api/history/revision_manager/ram.py +12 -12
- amulet/api/item.py +75 -75
- amulet/api/level/__init__.py +4 -4
- amulet/api/level/base_level/__init__.py +1 -1
- amulet/api/level/base_level/base_level.py +1035 -1026
- amulet/api/level/base_level/chunk_manager.py +227 -227
- amulet/api/level/base_level/clone.py +389 -389
- amulet/api/level/base_level/player_manager.py +101 -101
- amulet/api/level/immutable_structure/__init__.py +1 -1
- amulet/api/level/immutable_structure/immutable_structure.py +94 -94
- amulet/api/level/immutable_structure/void_format_wrapper.py +117 -117
- amulet/api/level/structure.py +22 -22
- amulet/api/level/world.py +19 -19
- amulet/api/partial_3d_array/__init__.py +2 -2
- amulet/api/partial_3d_array/base_partial_3d_array.py +263 -263
- amulet/api/partial_3d_array/bounded_partial_3d_array.py +528 -528
- amulet/api/partial_3d_array/data_types.py +15 -15
- amulet/api/partial_3d_array/unbounded_partial_3d_array.py +229 -229
- amulet/api/partial_3d_array/util.py +152 -152
- amulet/api/player.py +65 -65
- amulet/api/registry/__init__.py +2 -2
- amulet/api/registry/base_registry.py +34 -34
- amulet/api/registry/biome_manager.py +153 -153
- amulet/api/registry/block_manager.py +156 -156
- amulet/api/selection/__init__.py +2 -2
- amulet/api/selection/abstract_selection.py +315 -315
- amulet/api/selection/box.py +805 -805
- amulet/api/selection/group.py +488 -488
- amulet/api/structure.py +37 -37
- amulet/api/wrapper/__init__.py +8 -8
- amulet/api/wrapper/chunk/interface.py +441 -441
- amulet/api/wrapper/chunk/translator.py +567 -567
- amulet/api/wrapper/format_wrapper.py +772 -772
- amulet/api/wrapper/structure_format_wrapper.py +116 -116
- amulet/api/wrapper/world_format_wrapper.py +63 -63
- amulet/level/__init__.py +1 -1
- amulet/level/formats/anvil_forge_world.py +40 -40
- amulet/level/formats/anvil_world/__init__.py +3 -3
- amulet/level/formats/anvil_world/_sector_manager.py +291 -384
- amulet/level/formats/anvil_world/data_pack/__init__.py +2 -2
- amulet/level/formats/anvil_world/data_pack/data_pack.py +224 -224
- amulet/level/formats/anvil_world/data_pack/data_pack_manager.py +77 -77
- amulet/level/formats/anvil_world/dimension.py +177 -177
- amulet/level/formats/anvil_world/format.py +769 -769
- amulet/level/formats/anvil_world/region.py +384 -384
- amulet/level/formats/construction/__init__.py +3 -3
- amulet/level/formats/construction/format_wrapper.py +515 -515
- amulet/level/formats/construction/interface.py +134 -134
- amulet/level/formats/construction/section.py +60 -60
- amulet/level/formats/construction/util.py +165 -165
- amulet/level/formats/leveldb_world/__init__.py +3 -3
- amulet/level/formats/leveldb_world/chunk.py +33 -33
- amulet/level/formats/leveldb_world/dimension.py +385 -419
- amulet/level/formats/leveldb_world/format.py +659 -641
- amulet/level/formats/leveldb_world/interface/chunk/__init__.py +36 -36
- amulet/level/formats/leveldb_world/interface/chunk/base_leveldb_interface.py +836 -836
- amulet/level/formats/leveldb_world/interface/chunk/generate_interface.py +31 -31
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_0.py +30 -30
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_1.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_10.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_11.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_12.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_13.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_14.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_15.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_16.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_17.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_18.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_19.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_2.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_20.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_21.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_22.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_23.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_24.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_25.py +24 -24
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_26.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_27.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_28.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_29.py +33 -33
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_3.py +57 -57
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_30.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_31.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_32.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_33.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_34.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_35.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_36.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_37.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_38.py +10 -10
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_39.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_4.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_40.py +16 -16
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_5.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_6.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_7.py +12 -12
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_8.py +180 -180
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_9.py +18 -18
- amulet/level/formats/leveldb_world/interface/chunk/leveldb_chunk_versions.py +79 -79
- amulet/level/formats/mcstructure/__init__.py +3 -3
- amulet/level/formats/mcstructure/chunk.py +50 -50
- amulet/level/formats/mcstructure/format_wrapper.py +408 -408
- amulet/level/formats/mcstructure/interface.py +175 -175
- amulet/level/formats/schematic/__init__.py +3 -3
- amulet/level/formats/schematic/chunk.py +55 -55
- amulet/level/formats/schematic/data_types.py +4 -4
- amulet/level/formats/schematic/format_wrapper.py +373 -373
- amulet/level/formats/schematic/interface.py +142 -142
- amulet/level/formats/sponge_schem/__init__.py +4 -4
- amulet/level/formats/sponge_schem/chunk.py +62 -62
- amulet/level/formats/sponge_schem/format_wrapper.py +463 -463
- amulet/level/formats/sponge_schem/interface.py +118 -118
- amulet/level/formats/sponge_schem/varint/__init__.py +1 -1
- amulet/level/formats/sponge_schem/varint/varint.py +87 -87
- amulet/level/interfaces/chunk/anvil/anvil_0.py +72 -72
- amulet/level/interfaces/chunk/anvil/anvil_1444.py +336 -336
- amulet/level/interfaces/chunk/anvil/anvil_1466.py +94 -94
- amulet/level/interfaces/chunk/anvil/anvil_1467.py +37 -37
- amulet/level/interfaces/chunk/anvil/anvil_1484.py +20 -20
- amulet/level/interfaces/chunk/anvil/anvil_1503.py +20 -20
- amulet/level/interfaces/chunk/anvil/anvil_1519.py +34 -34
- amulet/level/interfaces/chunk/anvil/anvil_1901.py +20 -20
- amulet/level/interfaces/chunk/anvil/anvil_1908.py +20 -20
- amulet/level/interfaces/chunk/anvil/anvil_1912.py +21 -21
- amulet/level/interfaces/chunk/anvil/anvil_1934.py +20 -20
- amulet/level/interfaces/chunk/anvil/anvil_2203.py +69 -69
- amulet/level/interfaces/chunk/anvil/anvil_2529.py +19 -19
- amulet/level/interfaces/chunk/anvil/anvil_2681.py +76 -76
- amulet/level/interfaces/chunk/anvil/anvil_2709.py +19 -19
- amulet/level/interfaces/chunk/anvil/anvil_2844.py +267 -267
- amulet/level/interfaces/chunk/anvil/anvil_3463.py +19 -19
- amulet/level/interfaces/chunk/anvil/anvil_na.py +607 -607
- amulet/level/interfaces/chunk/anvil/base_anvil_interface.py +326 -326
- amulet/level/load.py +59 -59
- amulet/level/loader.py +95 -95
- amulet/level/translators/chunk/bedrock/__init__.py +267 -267
- amulet/level/translators/chunk/bedrock/bedrock_nbt_blockstate_translator.py +46 -46
- amulet/level/translators/chunk/bedrock/bedrock_numerical_translator.py +39 -39
- amulet/level/translators/chunk/bedrock/bedrock_psudo_numerical_translator.py +37 -37
- amulet/level/translators/chunk/java/java_1_18_translator.py +40 -40
- amulet/level/translators/chunk/java/java_blockstate_translator.py +94 -94
- amulet/level/translators/chunk/java/java_numerical_translator.py +62 -62
- amulet/libs/leveldb/__init__.py +7 -7
- amulet/operations/__init__.py +5 -5
- amulet/operations/clone.py +18 -18
- amulet/operations/delete_chunk.py +32 -32
- amulet/operations/fill.py +30 -30
- amulet/operations/paste.py +65 -65
- amulet/operations/replace.py +58 -58
- amulet/utils/__init__.py +14 -14
- amulet/utils/format_utils.py +41 -41
- amulet/utils/generator.py +15 -15
- amulet/utils/matrix.py +243 -243
- amulet/utils/numpy_helpers.py +46 -46
- amulet/utils/world_utils.py +349 -349
- {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/METADATA +97 -97
- amulet_core-1.9.20.dist-info/RECORD +208 -0
- amulet_core-1.9.19.dist-info/RECORD +0 -208
- {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/WHEEL +0 -0
- {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/entry_points.txt +0 -0
- {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/top_level.txt +0 -0
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, Any, Tuple
|
|
2
|
-
import numpy
|
|
3
|
-
|
|
4
|
-
from amulet.api.wrapper import Interface, EntityIDType, EntityCoordType
|
|
5
|
-
from .chunk import SchematicChunk
|
|
6
|
-
from amulet.api.chunk import Chunk
|
|
7
|
-
from amulet.api.selection import SelectionBox
|
|
8
|
-
from amulet.level.loader import Translators
|
|
9
|
-
from amulet.api.data_types import (
|
|
10
|
-
AnyNDArray,
|
|
11
|
-
VersionNumberAny,
|
|
12
|
-
VersionIdentifierType,
|
|
13
|
-
PlatformType,
|
|
14
|
-
VersionNumberTuple,
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
from amulet_nbt import NamedTag
|
|
18
|
-
|
|
19
|
-
if TYPE_CHECKING:
|
|
20
|
-
from amulet.api.wrapper import Translator
|
|
21
|
-
from PyMCTranslate import TranslationManager
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class SchematicInterface(Interface):
|
|
25
|
-
_entity_id_type = None
|
|
26
|
-
_entity_coord_type = None
|
|
27
|
-
_block_entity_id_type = None
|
|
28
|
-
_block_entity_coord_type = None
|
|
29
|
-
|
|
30
|
-
def is_valid(self, key: Tuple) -> bool:
|
|
31
|
-
return True
|
|
32
|
-
|
|
33
|
-
def decode(
|
|
34
|
-
self, cx: int, cz: int, data: SchematicChunk
|
|
35
|
-
) -> Tuple["Chunk", AnyNDArray]:
|
|
36
|
-
"""
|
|
37
|
-
Create an amulet.api.chunk.Chunk object from raw data given by the format
|
|
38
|
-
:param cx: chunk x coordinate
|
|
39
|
-
:param cz: chunk z coordinate
|
|
40
|
-
:param data: Raw chunk data provided by the format.
|
|
41
|
-
:return: Chunk object in version-specific format, along with the block_palette for that chunk.
|
|
42
|
-
"""
|
|
43
|
-
chunk = Chunk(cx, cz)
|
|
44
|
-
block_palette, blocks = numpy.unique(
|
|
45
|
-
(data.blocks << 4) + (data.data & 0xF), return_inverse=True
|
|
46
|
-
)
|
|
47
|
-
blocks = blocks.reshape(data.blocks.shape)
|
|
48
|
-
palette = numpy.empty(len(block_palette) + 1, dtype=object)
|
|
49
|
-
palette[0] = (0, 0)
|
|
50
|
-
for index, block_num in enumerate(block_palette):
|
|
51
|
-
palette[index + 1] = (block_num >> 4, block_num & 0xF)
|
|
52
|
-
|
|
53
|
-
box = data.selection.create_moved_box((cx * 16, 0, cz * 16), subtract=True)
|
|
54
|
-
chunk.blocks[box.slice] = blocks + 1
|
|
55
|
-
for tag in data.block_entities:
|
|
56
|
-
block_entity = self._decode_block_entity(
|
|
57
|
-
NamedTag(tag), self._block_entity_id_type, self._block_entity_coord_type
|
|
58
|
-
)
|
|
59
|
-
if block_entity is not None:
|
|
60
|
-
chunk.block_entities.insert(block_entity)
|
|
61
|
-
for tag in data.entities:
|
|
62
|
-
entity = self._decode_entity(
|
|
63
|
-
NamedTag(tag), self._block_entity_id_type, self._block_entity_coord_type
|
|
64
|
-
)
|
|
65
|
-
if entity is not None:
|
|
66
|
-
chunk.entities.append(entity)
|
|
67
|
-
|
|
68
|
-
return chunk, palette
|
|
69
|
-
|
|
70
|
-
def encode(
|
|
71
|
-
self,
|
|
72
|
-
chunk: "Chunk",
|
|
73
|
-
palette: AnyNDArray,
|
|
74
|
-
max_world_version: VersionIdentifierType,
|
|
75
|
-
box: SelectionBox,
|
|
76
|
-
) -> SchematicChunk:
|
|
77
|
-
"""
|
|
78
|
-
Take a version-specific chunk and encode it to raw data for the format to store.
|
|
79
|
-
:param chunk: The already translated version-specfic chunk to encode.
|
|
80
|
-
:param palette: The block_palette the ids in the chunk correspond to.
|
|
81
|
-
:type palette: numpy.ndarray[Block]
|
|
82
|
-
:param max_world_version: The key to use to find the encoder.
|
|
83
|
-
:param box: The volume of the chunk to pack.
|
|
84
|
-
:return: Raw data to be stored by the Format.
|
|
85
|
-
"""
|
|
86
|
-
entities = []
|
|
87
|
-
for entity in chunk.entities:
|
|
88
|
-
if entity.location in box:
|
|
89
|
-
entities.append(
|
|
90
|
-
self._encode_entity(
|
|
91
|
-
entity, self._entity_id_type, self._entity_coord_type
|
|
92
|
-
).compound
|
|
93
|
-
)
|
|
94
|
-
block_entities = []
|
|
95
|
-
for block_entity in chunk.block_entities:
|
|
96
|
-
if block_entity.location in box:
|
|
97
|
-
block_entities.append(
|
|
98
|
-
self._encode_block_entity(
|
|
99
|
-
block_entity,
|
|
100
|
-
self._block_entity_id_type,
|
|
101
|
-
self._block_entity_coord_type,
|
|
102
|
-
).compound
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
slices = box.create_moved_box(
|
|
106
|
-
(chunk.cx * 16, 0, chunk.cz * 16), subtract=True
|
|
107
|
-
).slice
|
|
108
|
-
blocks_merged = palette[chunk.blocks[slices]]
|
|
109
|
-
|
|
110
|
-
return SchematicChunk(
|
|
111
|
-
box,
|
|
112
|
-
blocks_merged[:, :, :, 0].astype(numpy.uint16),
|
|
113
|
-
blocks_merged[:, :, :, 1].astype(numpy.uint8),
|
|
114
|
-
block_entities,
|
|
115
|
-
entities,
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
def get_translator(
|
|
119
|
-
self,
|
|
120
|
-
max_world_version: Tuple[PlatformType, VersionNumberTuple],
|
|
121
|
-
data: Any = None,
|
|
122
|
-
translation_manager: "TranslationManager" = None,
|
|
123
|
-
) -> Tuple["Translator", VersionNumberAny]:
|
|
124
|
-
platform, version_number = max_world_version
|
|
125
|
-
if platform == "java":
|
|
126
|
-
version = translation_manager.get_version(platform, version_number)
|
|
127
|
-
version_number = version.data_version
|
|
128
|
-
return Translators.get((platform, version_number)), version_number
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
class JavaSchematicInterface(SchematicInterface):
|
|
132
|
-
_entity_id_type = EntityIDType.namespace_str_id
|
|
133
|
-
_entity_coord_type = EntityCoordType.Pos_list_double
|
|
134
|
-
_block_entity_id_type = EntityIDType.namespace_str_id
|
|
135
|
-
_block_entity_coord_type = EntityCoordType.xyz_int
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
class BedrockSchematicInterface(SchematicInterface):
|
|
139
|
-
_entity_id_type = EntityIDType.namespace_str_identifier
|
|
140
|
-
_entity_coord_type = EntityCoordType.Pos_list_float
|
|
141
|
-
_block_entity_id_type = EntityIDType.str_id
|
|
142
|
-
_block_entity_coord_type = EntityCoordType.xyz_int
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Tuple
|
|
2
|
+
import numpy
|
|
3
|
+
|
|
4
|
+
from amulet.api.wrapper import Interface, EntityIDType, EntityCoordType
|
|
5
|
+
from .chunk import SchematicChunk
|
|
6
|
+
from amulet.api.chunk import Chunk
|
|
7
|
+
from amulet.api.selection import SelectionBox
|
|
8
|
+
from amulet.level.loader import Translators
|
|
9
|
+
from amulet.api.data_types import (
|
|
10
|
+
AnyNDArray,
|
|
11
|
+
VersionNumberAny,
|
|
12
|
+
VersionIdentifierType,
|
|
13
|
+
PlatformType,
|
|
14
|
+
VersionNumberTuple,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from amulet_nbt import NamedTag
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from amulet.api.wrapper import Translator
|
|
21
|
+
from PyMCTranslate import TranslationManager
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SchematicInterface(Interface):
|
|
25
|
+
_entity_id_type = None
|
|
26
|
+
_entity_coord_type = None
|
|
27
|
+
_block_entity_id_type = None
|
|
28
|
+
_block_entity_coord_type = None
|
|
29
|
+
|
|
30
|
+
def is_valid(self, key: Tuple) -> bool:
|
|
31
|
+
return True
|
|
32
|
+
|
|
33
|
+
def decode(
|
|
34
|
+
self, cx: int, cz: int, data: SchematicChunk
|
|
35
|
+
) -> Tuple["Chunk", AnyNDArray]:
|
|
36
|
+
"""
|
|
37
|
+
Create an amulet.api.chunk.Chunk object from raw data given by the format
|
|
38
|
+
:param cx: chunk x coordinate
|
|
39
|
+
:param cz: chunk z coordinate
|
|
40
|
+
:param data: Raw chunk data provided by the format.
|
|
41
|
+
:return: Chunk object in version-specific format, along with the block_palette for that chunk.
|
|
42
|
+
"""
|
|
43
|
+
chunk = Chunk(cx, cz)
|
|
44
|
+
block_palette, blocks = numpy.unique(
|
|
45
|
+
(data.blocks << 4) + (data.data & 0xF), return_inverse=True
|
|
46
|
+
)
|
|
47
|
+
blocks = blocks.reshape(data.blocks.shape)
|
|
48
|
+
palette = numpy.empty(len(block_palette) + 1, dtype=object)
|
|
49
|
+
palette[0] = (0, 0)
|
|
50
|
+
for index, block_num in enumerate(block_palette):
|
|
51
|
+
palette[index + 1] = (block_num >> 4, block_num & 0xF)
|
|
52
|
+
|
|
53
|
+
box = data.selection.create_moved_box((cx * 16, 0, cz * 16), subtract=True)
|
|
54
|
+
chunk.blocks[box.slice] = blocks + 1
|
|
55
|
+
for tag in data.block_entities:
|
|
56
|
+
block_entity = self._decode_block_entity(
|
|
57
|
+
NamedTag(tag), self._block_entity_id_type, self._block_entity_coord_type
|
|
58
|
+
)
|
|
59
|
+
if block_entity is not None:
|
|
60
|
+
chunk.block_entities.insert(block_entity)
|
|
61
|
+
for tag in data.entities:
|
|
62
|
+
entity = self._decode_entity(
|
|
63
|
+
NamedTag(tag), self._block_entity_id_type, self._block_entity_coord_type
|
|
64
|
+
)
|
|
65
|
+
if entity is not None:
|
|
66
|
+
chunk.entities.append(entity)
|
|
67
|
+
|
|
68
|
+
return chunk, palette
|
|
69
|
+
|
|
70
|
+
def encode(
|
|
71
|
+
self,
|
|
72
|
+
chunk: "Chunk",
|
|
73
|
+
palette: AnyNDArray,
|
|
74
|
+
max_world_version: VersionIdentifierType,
|
|
75
|
+
box: SelectionBox,
|
|
76
|
+
) -> SchematicChunk:
|
|
77
|
+
"""
|
|
78
|
+
Take a version-specific chunk and encode it to raw data for the format to store.
|
|
79
|
+
:param chunk: The already translated version-specfic chunk to encode.
|
|
80
|
+
:param palette: The block_palette the ids in the chunk correspond to.
|
|
81
|
+
:type palette: numpy.ndarray[Block]
|
|
82
|
+
:param max_world_version: The key to use to find the encoder.
|
|
83
|
+
:param box: The volume of the chunk to pack.
|
|
84
|
+
:return: Raw data to be stored by the Format.
|
|
85
|
+
"""
|
|
86
|
+
entities = []
|
|
87
|
+
for entity in chunk.entities:
|
|
88
|
+
if entity.location in box:
|
|
89
|
+
entities.append(
|
|
90
|
+
self._encode_entity(
|
|
91
|
+
entity, self._entity_id_type, self._entity_coord_type
|
|
92
|
+
).compound
|
|
93
|
+
)
|
|
94
|
+
block_entities = []
|
|
95
|
+
for block_entity in chunk.block_entities:
|
|
96
|
+
if block_entity.location in box:
|
|
97
|
+
block_entities.append(
|
|
98
|
+
self._encode_block_entity(
|
|
99
|
+
block_entity,
|
|
100
|
+
self._block_entity_id_type,
|
|
101
|
+
self._block_entity_coord_type,
|
|
102
|
+
).compound
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
slices = box.create_moved_box(
|
|
106
|
+
(chunk.cx * 16, 0, chunk.cz * 16), subtract=True
|
|
107
|
+
).slice
|
|
108
|
+
blocks_merged = palette[chunk.blocks[slices]]
|
|
109
|
+
|
|
110
|
+
return SchematicChunk(
|
|
111
|
+
box,
|
|
112
|
+
blocks_merged[:, :, :, 0].astype(numpy.uint16),
|
|
113
|
+
blocks_merged[:, :, :, 1].astype(numpy.uint8),
|
|
114
|
+
block_entities,
|
|
115
|
+
entities,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
def get_translator(
|
|
119
|
+
self,
|
|
120
|
+
max_world_version: Tuple[PlatformType, VersionNumberTuple],
|
|
121
|
+
data: Any = None,
|
|
122
|
+
translation_manager: "TranslationManager" = None,
|
|
123
|
+
) -> Tuple["Translator", VersionNumberAny]:
|
|
124
|
+
platform, version_number = max_world_version
|
|
125
|
+
if platform == "java":
|
|
126
|
+
version = translation_manager.get_version(platform, version_number)
|
|
127
|
+
version_number = version.data_version
|
|
128
|
+
return Translators.get((platform, version_number)), version_number
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class JavaSchematicInterface(SchematicInterface):
|
|
132
|
+
_entity_id_type = EntityIDType.namespace_str_id
|
|
133
|
+
_entity_coord_type = EntityCoordType.Pos_list_double
|
|
134
|
+
_block_entity_id_type = EntityIDType.namespace_str_id
|
|
135
|
+
_block_entity_coord_type = EntityCoordType.xyz_int
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class BedrockSchematicInterface(SchematicInterface):
|
|
139
|
+
_entity_id_type = EntityIDType.namespace_str_identifier
|
|
140
|
+
_entity_coord_type = EntityCoordType.Pos_list_float
|
|
141
|
+
_block_entity_id_type = EntityIDType.str_id
|
|
142
|
+
_block_entity_coord_type = EntityCoordType.xyz_int
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# meta format
|
|
2
|
-
from .format_wrapper import SpongeSchemFormatWrapper
|
|
3
|
-
|
|
4
|
-
export = SpongeSchemFormatWrapper
|
|
1
|
+
# meta format
|
|
2
|
+
from .format_wrapper import SpongeSchemFormatWrapper
|
|
3
|
+
|
|
4
|
+
export = SpongeSchemFormatWrapper
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
from typing import List
|
|
2
|
-
import numpy
|
|
3
|
-
|
|
4
|
-
from amulet_nbt import CompoundTag
|
|
5
|
-
|
|
6
|
-
from amulet.api.selection import SelectionBox
|
|
7
|
-
from amulet.api.data_types import BlockCoordinates, AnyNDArray
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class SpongeSchemChunk:
|
|
11
|
-
__slots__ = (
|
|
12
|
-
"selection",
|
|
13
|
-
"_blocks",
|
|
14
|
-
"palette",
|
|
15
|
-
"shape",
|
|
16
|
-
"entities",
|
|
17
|
-
"block_entities",
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
def __init__(
|
|
21
|
-
self,
|
|
22
|
-
selection: SelectionBox,
|
|
23
|
-
blocks: numpy.ndarray,
|
|
24
|
-
palette: AnyNDArray,
|
|
25
|
-
block_entities: List[CompoundTag],
|
|
26
|
-
entities: List[CompoundTag],
|
|
27
|
-
):
|
|
28
|
-
self.selection = selection
|
|
29
|
-
self.blocks = blocks
|
|
30
|
-
self.palette = palette
|
|
31
|
-
self.block_entities = block_entities
|
|
32
|
-
self.entities = entities
|
|
33
|
-
|
|
34
|
-
def __eq__(self, other):
|
|
35
|
-
return (
|
|
36
|
-
isinstance(other, SpongeSchemChunk)
|
|
37
|
-
and self.selection == other.selection
|
|
38
|
-
and self.shape == other.shape
|
|
39
|
-
and numpy.array_equal(self.blocks, other.blocks)
|
|
40
|
-
and self.entities == other.entities
|
|
41
|
-
and self.block_entities == other.block_entities
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
@property
|
|
45
|
-
def location(self) -> BlockCoordinates:
|
|
46
|
-
return self.selection.min
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def blocks(self) -> numpy.ndarray:
|
|
50
|
-
return self._blocks
|
|
51
|
-
|
|
52
|
-
@blocks.setter
|
|
53
|
-
def blocks(self, blocks: numpy.ndarray):
|
|
54
|
-
if not (
|
|
55
|
-
isinstance(blocks, numpy.ndarray)
|
|
56
|
-
and blocks.shape == self.selection.shape
|
|
57
|
-
and numpy.issubdtype(blocks.dtype, numpy.integer)
|
|
58
|
-
):
|
|
59
|
-
raise TypeError(
|
|
60
|
-
"SpongeSchemChunk.blocks must be a integer numpy array with shape that matches selection"
|
|
61
|
-
)
|
|
62
|
-
self._blocks = blocks
|
|
1
|
+
from typing import List
|
|
2
|
+
import numpy
|
|
3
|
+
|
|
4
|
+
from amulet_nbt import CompoundTag
|
|
5
|
+
|
|
6
|
+
from amulet.api.selection import SelectionBox
|
|
7
|
+
from amulet.api.data_types import BlockCoordinates, AnyNDArray
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SpongeSchemChunk:
|
|
11
|
+
__slots__ = (
|
|
12
|
+
"selection",
|
|
13
|
+
"_blocks",
|
|
14
|
+
"palette",
|
|
15
|
+
"shape",
|
|
16
|
+
"entities",
|
|
17
|
+
"block_entities",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
selection: SelectionBox,
|
|
23
|
+
blocks: numpy.ndarray,
|
|
24
|
+
palette: AnyNDArray,
|
|
25
|
+
block_entities: List[CompoundTag],
|
|
26
|
+
entities: List[CompoundTag],
|
|
27
|
+
):
|
|
28
|
+
self.selection = selection
|
|
29
|
+
self.blocks = blocks
|
|
30
|
+
self.palette = palette
|
|
31
|
+
self.block_entities = block_entities
|
|
32
|
+
self.entities = entities
|
|
33
|
+
|
|
34
|
+
def __eq__(self, other):
|
|
35
|
+
return (
|
|
36
|
+
isinstance(other, SpongeSchemChunk)
|
|
37
|
+
and self.selection == other.selection
|
|
38
|
+
and self.shape == other.shape
|
|
39
|
+
and numpy.array_equal(self.blocks, other.blocks)
|
|
40
|
+
and self.entities == other.entities
|
|
41
|
+
and self.block_entities == other.block_entities
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def location(self) -> BlockCoordinates:
|
|
46
|
+
return self.selection.min
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def blocks(self) -> numpy.ndarray:
|
|
50
|
+
return self._blocks
|
|
51
|
+
|
|
52
|
+
@blocks.setter
|
|
53
|
+
def blocks(self, blocks: numpy.ndarray):
|
|
54
|
+
if not (
|
|
55
|
+
isinstance(blocks, numpy.ndarray)
|
|
56
|
+
and blocks.shape == self.selection.shape
|
|
57
|
+
and numpy.issubdtype(blocks.dtype, numpy.integer)
|
|
58
|
+
):
|
|
59
|
+
raise TypeError(
|
|
60
|
+
"SpongeSchemChunk.blocks must be a integer numpy array with shape that matches selection"
|
|
61
|
+
)
|
|
62
|
+
self._blocks = blocks
|