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,134 +1,134 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, Any, Tuple, List
|
|
2
|
-
import numpy
|
|
3
|
-
|
|
4
|
-
from amulet_nbt import IntTag
|
|
5
|
-
from amulet.api.wrapper import Interface
|
|
6
|
-
from .section import ConstructionSection
|
|
7
|
-
from amulet.api.chunk import Chunk
|
|
8
|
-
from amulet.api.block import Block
|
|
9
|
-
from amulet.api.selection import SelectionBox
|
|
10
|
-
from amulet.level.loader import Translators
|
|
11
|
-
from amulet.api.data_types import (
|
|
12
|
-
AnyNDArray,
|
|
13
|
-
PlatformType,
|
|
14
|
-
VersionNumberTuple,
|
|
15
|
-
VersionIdentifierType,
|
|
16
|
-
VersionNumberAny,
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
if TYPE_CHECKING:
|
|
20
|
-
from amulet.api.wrapper import Translator
|
|
21
|
-
from PyMCTranslate import TranslationManager
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class ConstructionInterface(Interface):
|
|
25
|
-
def is_valid(self, key: Tuple) -> bool:
|
|
26
|
-
return key[0] == "construction" and key[1] == 0
|
|
27
|
-
|
|
28
|
-
def decode(
|
|
29
|
-
self, cx: int, cz: int, data: List[ConstructionSection]
|
|
30
|
-
) -> Tuple["Chunk", AnyNDArray]:
|
|
31
|
-
"""
|
|
32
|
-
Create an amulet.api.chunk.Chunk object from raw data given by the format
|
|
33
|
-
:param cx: chunk x coordinate
|
|
34
|
-
:param cz: chunk z coordinate
|
|
35
|
-
:param data: Raw chunk data provided by the format.
|
|
36
|
-
:return: Chunk object in version-specific format, along with the block_palette for that chunk.
|
|
37
|
-
"""
|
|
38
|
-
chunk = Chunk(cx, cz)
|
|
39
|
-
palette = []
|
|
40
|
-
for section in data:
|
|
41
|
-
if any(s == 0 for s in section.shape):
|
|
42
|
-
continue
|
|
43
|
-
if section.blocks is not None:
|
|
44
|
-
shapex, shapey, shapez = section.shape
|
|
45
|
-
sx = section.sx % 16
|
|
46
|
-
sy = section.sy
|
|
47
|
-
sz = section.sz % 16
|
|
48
|
-
chunk.blocks[
|
|
49
|
-
sx : sx + shapex,
|
|
50
|
-
sy : sy + shapey,
|
|
51
|
-
sz : sz + shapez,
|
|
52
|
-
] = section.blocks.astype(numpy.uint32) + len(palette)
|
|
53
|
-
chunk.block_entities.update(section.block_entities)
|
|
54
|
-
chunk.entities.extend(section.entities)
|
|
55
|
-
palette += section.palette
|
|
56
|
-
|
|
57
|
-
np_palette, inverse = numpy.unique(palette, return_inverse=True)
|
|
58
|
-
np_palette = numpy.insert(
|
|
59
|
-
np_palette,
|
|
60
|
-
0,
|
|
61
|
-
Block(
|
|
62
|
-
namespace="minecraft",
|
|
63
|
-
base_name="air",
|
|
64
|
-
properties={"block_data": IntTag(0)},
|
|
65
|
-
),
|
|
66
|
-
)
|
|
67
|
-
inverse += 1
|
|
68
|
-
np_palette: AnyNDArray
|
|
69
|
-
inverse: numpy.ndarray
|
|
70
|
-
for cy in chunk.blocks.sub_chunks:
|
|
71
|
-
chunk.blocks.add_sub_chunk(
|
|
72
|
-
cy, inverse[chunk.blocks.get_sub_chunk(cy)].astype(numpy.uint32)
|
|
73
|
-
)
|
|
74
|
-
return chunk, np_palette
|
|
75
|
-
|
|
76
|
-
def encode(
|
|
77
|
-
self,
|
|
78
|
-
chunk: "Chunk",
|
|
79
|
-
palette: AnyNDArray,
|
|
80
|
-
max_world_version: VersionIdentifierType,
|
|
81
|
-
boxes: List[SelectionBox],
|
|
82
|
-
) -> List[ConstructionSection]:
|
|
83
|
-
"""
|
|
84
|
-
Take a version-specific chunk and encode it to raw data for the format to store.
|
|
85
|
-
:param chunk: The already translated version-specfic chunk to encode.
|
|
86
|
-
:param palette: The block_palette the ids in the chunk correspond to.
|
|
87
|
-
:type palette: numpy.ndarray[Block]
|
|
88
|
-
:param max_world_version: The key to use to find the encoder.
|
|
89
|
-
:param boxes: The volume(s) of the chunk to pack.
|
|
90
|
-
:return: Raw data to be stored by the Format.
|
|
91
|
-
"""
|
|
92
|
-
sections = []
|
|
93
|
-
for box in boxes:
|
|
94
|
-
cx, cz = chunk.cx, chunk.cz
|
|
95
|
-
for cy in box.chunk_y_locations():
|
|
96
|
-
sub_box = box.intersection(
|
|
97
|
-
SelectionBox.create_sub_chunk_box(cx, cy, cz)
|
|
98
|
-
)
|
|
99
|
-
entities = [e for e in chunk.entities if e.location in sub_box]
|
|
100
|
-
if cy in chunk.blocks:
|
|
101
|
-
sections.append(
|
|
102
|
-
ConstructionSection(
|
|
103
|
-
sub_box.min,
|
|
104
|
-
sub_box.shape,
|
|
105
|
-
numpy.asarray(chunk.blocks[sub_box.chunk_slice(cx, cz)]),
|
|
106
|
-
list(palette),
|
|
107
|
-
entities,
|
|
108
|
-
[e for e in chunk.block_entities if e.location in sub_box],
|
|
109
|
-
)
|
|
110
|
-
)
|
|
111
|
-
elif entities:
|
|
112
|
-
sections.append(
|
|
113
|
-
ConstructionSection(
|
|
114
|
-
sub_box.min, sub_box.shape, None, [], entities, []
|
|
115
|
-
)
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
return sections
|
|
119
|
-
|
|
120
|
-
def get_translator(
|
|
121
|
-
self,
|
|
122
|
-
max_world_version: Tuple[PlatformType, VersionNumberTuple],
|
|
123
|
-
data: Any = None,
|
|
124
|
-
translation_manager: "TranslationManager" = None,
|
|
125
|
-
) -> Tuple["Translator", VersionNumberAny]:
|
|
126
|
-
platform, version_number = max_world_version
|
|
127
|
-
version = translation_manager.get_version(platform, version_number)
|
|
128
|
-
if platform == "java":
|
|
129
|
-
version_number = version.data_version
|
|
130
|
-
return Translators.get((platform, version_number)), version_number
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
class Construction0Interface(ConstructionInterface):
|
|
134
|
-
pass
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Tuple, List
|
|
2
|
+
import numpy
|
|
3
|
+
|
|
4
|
+
from amulet_nbt import IntTag
|
|
5
|
+
from amulet.api.wrapper import Interface
|
|
6
|
+
from .section import ConstructionSection
|
|
7
|
+
from amulet.api.chunk import Chunk
|
|
8
|
+
from amulet.api.block import Block
|
|
9
|
+
from amulet.api.selection import SelectionBox
|
|
10
|
+
from amulet.level.loader import Translators
|
|
11
|
+
from amulet.api.data_types import (
|
|
12
|
+
AnyNDArray,
|
|
13
|
+
PlatformType,
|
|
14
|
+
VersionNumberTuple,
|
|
15
|
+
VersionIdentifierType,
|
|
16
|
+
VersionNumberAny,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from amulet.api.wrapper import Translator
|
|
21
|
+
from PyMCTranslate import TranslationManager
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ConstructionInterface(Interface):
|
|
25
|
+
def is_valid(self, key: Tuple) -> bool:
|
|
26
|
+
return key[0] == "construction" and key[1] == 0
|
|
27
|
+
|
|
28
|
+
def decode(
|
|
29
|
+
self, cx: int, cz: int, data: List[ConstructionSection]
|
|
30
|
+
) -> Tuple["Chunk", AnyNDArray]:
|
|
31
|
+
"""
|
|
32
|
+
Create an amulet.api.chunk.Chunk object from raw data given by the format
|
|
33
|
+
:param cx: chunk x coordinate
|
|
34
|
+
:param cz: chunk z coordinate
|
|
35
|
+
:param data: Raw chunk data provided by the format.
|
|
36
|
+
:return: Chunk object in version-specific format, along with the block_palette for that chunk.
|
|
37
|
+
"""
|
|
38
|
+
chunk = Chunk(cx, cz)
|
|
39
|
+
palette = []
|
|
40
|
+
for section in data:
|
|
41
|
+
if any(s == 0 for s in section.shape):
|
|
42
|
+
continue
|
|
43
|
+
if section.blocks is not None:
|
|
44
|
+
shapex, shapey, shapez = section.shape
|
|
45
|
+
sx = section.sx % 16
|
|
46
|
+
sy = section.sy
|
|
47
|
+
sz = section.sz % 16
|
|
48
|
+
chunk.blocks[
|
|
49
|
+
sx : sx + shapex,
|
|
50
|
+
sy : sy + shapey,
|
|
51
|
+
sz : sz + shapez,
|
|
52
|
+
] = section.blocks.astype(numpy.uint32) + len(palette)
|
|
53
|
+
chunk.block_entities.update(section.block_entities)
|
|
54
|
+
chunk.entities.extend(section.entities)
|
|
55
|
+
palette += section.palette
|
|
56
|
+
|
|
57
|
+
np_palette, inverse = numpy.unique(palette, return_inverse=True)
|
|
58
|
+
np_palette = numpy.insert(
|
|
59
|
+
np_palette,
|
|
60
|
+
0,
|
|
61
|
+
Block(
|
|
62
|
+
namespace="minecraft",
|
|
63
|
+
base_name="air",
|
|
64
|
+
properties={"block_data": IntTag(0)},
|
|
65
|
+
),
|
|
66
|
+
)
|
|
67
|
+
inverse += 1
|
|
68
|
+
np_palette: AnyNDArray
|
|
69
|
+
inverse: numpy.ndarray
|
|
70
|
+
for cy in chunk.blocks.sub_chunks:
|
|
71
|
+
chunk.blocks.add_sub_chunk(
|
|
72
|
+
cy, inverse[chunk.blocks.get_sub_chunk(cy)].astype(numpy.uint32)
|
|
73
|
+
)
|
|
74
|
+
return chunk, np_palette
|
|
75
|
+
|
|
76
|
+
def encode(
|
|
77
|
+
self,
|
|
78
|
+
chunk: "Chunk",
|
|
79
|
+
palette: AnyNDArray,
|
|
80
|
+
max_world_version: VersionIdentifierType,
|
|
81
|
+
boxes: List[SelectionBox],
|
|
82
|
+
) -> List[ConstructionSection]:
|
|
83
|
+
"""
|
|
84
|
+
Take a version-specific chunk and encode it to raw data for the format to store.
|
|
85
|
+
:param chunk: The already translated version-specfic chunk to encode.
|
|
86
|
+
:param palette: The block_palette the ids in the chunk correspond to.
|
|
87
|
+
:type palette: numpy.ndarray[Block]
|
|
88
|
+
:param max_world_version: The key to use to find the encoder.
|
|
89
|
+
:param boxes: The volume(s) of the chunk to pack.
|
|
90
|
+
:return: Raw data to be stored by the Format.
|
|
91
|
+
"""
|
|
92
|
+
sections = []
|
|
93
|
+
for box in boxes:
|
|
94
|
+
cx, cz = chunk.cx, chunk.cz
|
|
95
|
+
for cy in box.chunk_y_locations():
|
|
96
|
+
sub_box = box.intersection(
|
|
97
|
+
SelectionBox.create_sub_chunk_box(cx, cy, cz)
|
|
98
|
+
)
|
|
99
|
+
entities = [e for e in chunk.entities if e.location in sub_box]
|
|
100
|
+
if cy in chunk.blocks:
|
|
101
|
+
sections.append(
|
|
102
|
+
ConstructionSection(
|
|
103
|
+
sub_box.min,
|
|
104
|
+
sub_box.shape,
|
|
105
|
+
numpy.asarray(chunk.blocks[sub_box.chunk_slice(cx, cz)]),
|
|
106
|
+
list(palette),
|
|
107
|
+
entities,
|
|
108
|
+
[e for e in chunk.block_entities if e.location in sub_box],
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
elif entities:
|
|
112
|
+
sections.append(
|
|
113
|
+
ConstructionSection(
|
|
114
|
+
sub_box.min, sub_box.shape, None, [], entities, []
|
|
115
|
+
)
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
return sections
|
|
119
|
+
|
|
120
|
+
def get_translator(
|
|
121
|
+
self,
|
|
122
|
+
max_world_version: Tuple[PlatformType, VersionNumberTuple],
|
|
123
|
+
data: Any = None,
|
|
124
|
+
translation_manager: "TranslationManager" = None,
|
|
125
|
+
) -> Tuple["Translator", VersionNumberAny]:
|
|
126
|
+
platform, version_number = max_world_version
|
|
127
|
+
version = translation_manager.get_version(platform, version_number)
|
|
128
|
+
if platform == "java":
|
|
129
|
+
version_number = version.data_version
|
|
130
|
+
return Translators.get((platform, version_number)), version_number
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class Construction0Interface(ConstructionInterface):
|
|
134
|
+
pass
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import List, Optional
|
|
4
|
-
|
|
5
|
-
from amulet.api.data_types import BlockCoordinates
|
|
6
|
-
from amulet import Block
|
|
7
|
-
from amulet.api.entity import Entity
|
|
8
|
-
from amulet.api.block_entity import BlockEntity
|
|
9
|
-
|
|
10
|
-
import numpy
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ConstructionSection:
|
|
14
|
-
__slots__ = (
|
|
15
|
-
"sx",
|
|
16
|
-
"sy",
|
|
17
|
-
"sz",
|
|
18
|
-
"blocks",
|
|
19
|
-
"palette",
|
|
20
|
-
"shape",
|
|
21
|
-
"entities",
|
|
22
|
-
"block_entities",
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
def __init__(
|
|
26
|
-
self,
|
|
27
|
-
min_position: BlockCoordinates,
|
|
28
|
-
shape: BlockCoordinates,
|
|
29
|
-
blocks: Optional[numpy.ndarray],
|
|
30
|
-
palette: List[Block],
|
|
31
|
-
entities: List[Entity],
|
|
32
|
-
block_entities: List[BlockEntity],
|
|
33
|
-
):
|
|
34
|
-
self.sx, self.sy, self.sz = min_position
|
|
35
|
-
self.shape = shape
|
|
36
|
-
self.blocks = blocks
|
|
37
|
-
if blocks is not None:
|
|
38
|
-
assert isinstance(self.blocks, numpy.ndarray)
|
|
39
|
-
assert (
|
|
40
|
-
self.shape == self.blocks.shape
|
|
41
|
-
), "blocks shape does not match the specified section shape"
|
|
42
|
-
self.palette = palette
|
|
43
|
-
self.entities = entities
|
|
44
|
-
self.block_entities = block_entities
|
|
45
|
-
|
|
46
|
-
def __eq__(self, other):
|
|
47
|
-
return (
|
|
48
|
-
isinstance(other, ConstructionSection)
|
|
49
|
-
and self.sx == other.sx
|
|
50
|
-
and self.sy == other.sy
|
|
51
|
-
and self.sz == other.sz
|
|
52
|
-
and self.shape == other.shape
|
|
53
|
-
and numpy.equal(self.blocks, other.blocks).all()
|
|
54
|
-
and self.entities == other.entities
|
|
55
|
-
and self.block_entities == other.block_entities
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
@property
|
|
59
|
-
def location(self) -> BlockCoordinates:
|
|
60
|
-
return self.sx, self.sy, self.sz
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from amulet.api.data_types import BlockCoordinates
|
|
6
|
+
from amulet import Block
|
|
7
|
+
from amulet.api.entity import Entity
|
|
8
|
+
from amulet.api.block_entity import BlockEntity
|
|
9
|
+
|
|
10
|
+
import numpy
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ConstructionSection:
|
|
14
|
+
__slots__ = (
|
|
15
|
+
"sx",
|
|
16
|
+
"sy",
|
|
17
|
+
"sz",
|
|
18
|
+
"blocks",
|
|
19
|
+
"palette",
|
|
20
|
+
"shape",
|
|
21
|
+
"entities",
|
|
22
|
+
"block_entities",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
min_position: BlockCoordinates,
|
|
28
|
+
shape: BlockCoordinates,
|
|
29
|
+
blocks: Optional[numpy.ndarray],
|
|
30
|
+
palette: List[Block],
|
|
31
|
+
entities: List[Entity],
|
|
32
|
+
block_entities: List[BlockEntity],
|
|
33
|
+
):
|
|
34
|
+
self.sx, self.sy, self.sz = min_position
|
|
35
|
+
self.shape = shape
|
|
36
|
+
self.blocks = blocks
|
|
37
|
+
if blocks is not None:
|
|
38
|
+
assert isinstance(self.blocks, numpy.ndarray)
|
|
39
|
+
assert (
|
|
40
|
+
self.shape == self.blocks.shape
|
|
41
|
+
), "blocks shape does not match the specified section shape"
|
|
42
|
+
self.palette = palette
|
|
43
|
+
self.entities = entities
|
|
44
|
+
self.block_entities = block_entities
|
|
45
|
+
|
|
46
|
+
def __eq__(self, other):
|
|
47
|
+
return (
|
|
48
|
+
isinstance(other, ConstructionSection)
|
|
49
|
+
and self.sx == other.sx
|
|
50
|
+
and self.sy == other.sy
|
|
51
|
+
and self.sz == other.sz
|
|
52
|
+
and self.shape == other.shape
|
|
53
|
+
and numpy.equal(self.blocks, other.blocks).all()
|
|
54
|
+
and self.entities == other.entities
|
|
55
|
+
and self.block_entities == other.block_entities
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def location(self) -> BlockCoordinates:
|
|
60
|
+
return self.sx, self.sy, self.sz
|