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,165 +1,165 @@
|
|
|
1
|
-
from typing import List, Union, Type, Dict
|
|
2
|
-
import numpy
|
|
3
|
-
|
|
4
|
-
from amulet_nbt import (
|
|
5
|
-
IntTag,
|
|
6
|
-
DoubleTag,
|
|
7
|
-
StringTag,
|
|
8
|
-
ListTag,
|
|
9
|
-
CompoundTag,
|
|
10
|
-
ByteArrayTag,
|
|
11
|
-
IntArrayTag,
|
|
12
|
-
LongArrayTag,
|
|
13
|
-
NamedTag,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
from amulet.api.block import Block
|
|
17
|
-
from amulet.api.entity import Entity
|
|
18
|
-
from amulet.api.block_entity import BlockEntity
|
|
19
|
-
from amulet.api.registry import BlockManager
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def unpack_palette(raw_palette: ListTag) -> List[Block]:
|
|
23
|
-
block_palette = []
|
|
24
|
-
extra_block_map: Dict[int, ListTag[IntTag]] = {}
|
|
25
|
-
for block_index, block_nbt in enumerate(raw_palette):
|
|
26
|
-
block_nbt: CompoundTag
|
|
27
|
-
block = Block(
|
|
28
|
-
namespace=block_nbt.get_string("namespace").py_str,
|
|
29
|
-
base_name=block_nbt.get_string("blockname").py_str,
|
|
30
|
-
properties=block_nbt.get_compound("properties").py_dict,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
if block_nbt.get_list("extra_blocks"):
|
|
34
|
-
extra_block_map[block_index] = block_nbt.get_list("extra_blocks")
|
|
35
|
-
|
|
36
|
-
block_palette.append(block)
|
|
37
|
-
|
|
38
|
-
extra_blocks: ListTag[IntTag]
|
|
39
|
-
for block_index, extra_blocks in extra_block_map.items():
|
|
40
|
-
extra_block_objects = [block_palette[i.py_int] for i in extra_blocks]
|
|
41
|
-
|
|
42
|
-
resulting_block = block_palette[block_index]
|
|
43
|
-
for extra_block in extra_block_objects:
|
|
44
|
-
resulting_block = resulting_block + extra_block
|
|
45
|
-
|
|
46
|
-
block_palette[block_index] = resulting_block
|
|
47
|
-
return block_palette
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def parse_entities(entities: ListTag) -> List[Entity]:
|
|
51
|
-
return [
|
|
52
|
-
Entity(
|
|
53
|
-
entity.get_string("namespace").py_str,
|
|
54
|
-
entity.get_string("base_name").py_str,
|
|
55
|
-
entity.get_double("x").py_float,
|
|
56
|
-
entity.get_double("y").py_float,
|
|
57
|
-
entity.get_double("z").py_float,
|
|
58
|
-
NamedTag(entity.get_compound("nbt")),
|
|
59
|
-
)
|
|
60
|
-
for entity in entities
|
|
61
|
-
]
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def parse_block_entities(block_entities: ListTag) -> List[BlockEntity]:
|
|
65
|
-
return [
|
|
66
|
-
BlockEntity(
|
|
67
|
-
block_entity.get_string("namespace").py_str,
|
|
68
|
-
block_entity.get_string("base_name").py_str,
|
|
69
|
-
block_entity.get_int("x").py_int,
|
|
70
|
-
block_entity.get_int("y").py_int,
|
|
71
|
-
block_entity.get_int("z").py_int,
|
|
72
|
-
NamedTag(block_entity.get_compound("nbt")),
|
|
73
|
-
)
|
|
74
|
-
for block_entity in block_entities
|
|
75
|
-
]
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def generate_block_entry(block: Block, palette_len, extra_blocks) -> CompoundTag:
|
|
79
|
-
return CompoundTag(
|
|
80
|
-
{
|
|
81
|
-
"namespace": StringTag(block.namespace),
|
|
82
|
-
"blockname": StringTag(block.base_name),
|
|
83
|
-
"properties": CompoundTag(block.properties),
|
|
84
|
-
"extra_blocks": ListTag(
|
|
85
|
-
[
|
|
86
|
-
IntTag(palette_len + extra_blocks.index(_extra_block))
|
|
87
|
-
for _extra_block in block.extra_blocks
|
|
88
|
-
]
|
|
89
|
-
),
|
|
90
|
-
}
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def serialise_entities(entities: List[Entity]) -> ListTag:
|
|
95
|
-
return ListTag(
|
|
96
|
-
[
|
|
97
|
-
CompoundTag(
|
|
98
|
-
{
|
|
99
|
-
"namespace": StringTag(entity.namespace),
|
|
100
|
-
"base_name": StringTag(entity.base_name),
|
|
101
|
-
"x": DoubleTag(entity.x),
|
|
102
|
-
"y": DoubleTag(entity.y),
|
|
103
|
-
"z": DoubleTag(entity.z),
|
|
104
|
-
"nbt": entity.nbt.compound,
|
|
105
|
-
}
|
|
106
|
-
)
|
|
107
|
-
for entity in entities
|
|
108
|
-
]
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def serialise_block_entities(
|
|
113
|
-
block_entities: List[BlockEntity],
|
|
114
|
-
) -> ListTag:
|
|
115
|
-
return ListTag(
|
|
116
|
-
[
|
|
117
|
-
CompoundTag(
|
|
118
|
-
{
|
|
119
|
-
"namespace": StringTag(block_entity.namespace),
|
|
120
|
-
"base_name": StringTag(block_entity.base_name),
|
|
121
|
-
"x": IntTag(block_entity.x),
|
|
122
|
-
"y": IntTag(block_entity.y),
|
|
123
|
-
"z": IntTag(block_entity.z),
|
|
124
|
-
"nbt": block_entity.nbt.compound,
|
|
125
|
-
}
|
|
126
|
-
)
|
|
127
|
-
for block_entity in block_entities
|
|
128
|
-
]
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def find_fitting_array_type(
|
|
133
|
-
array: numpy.ndarray,
|
|
134
|
-
) -> Union[Type[IntArrayTag], Type[ByteArrayTag], Type[LongArrayTag]]:
|
|
135
|
-
max_element = array.max(initial=0)
|
|
136
|
-
|
|
137
|
-
if max_element <= 127:
|
|
138
|
-
return ByteArrayTag
|
|
139
|
-
elif max_element <= 2_147_483_647:
|
|
140
|
-
return IntArrayTag
|
|
141
|
-
else:
|
|
142
|
-
return LongArrayTag
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def pack_palette(palette: BlockManager) -> ListTag:
|
|
146
|
-
block_palette_nbt = ListTag()
|
|
147
|
-
extra_blocks = set()
|
|
148
|
-
|
|
149
|
-
for block in palette.blocks:
|
|
150
|
-
if len(block.extra_blocks) > 0:
|
|
151
|
-
extra_blocks.update(block.extra_blocks)
|
|
152
|
-
|
|
153
|
-
extra_blocks = list(extra_blocks)
|
|
154
|
-
|
|
155
|
-
palette_len = len(palette)
|
|
156
|
-
for block_entry in palette.blocks:
|
|
157
|
-
block_palette_nbt.append(
|
|
158
|
-
generate_block_entry(block_entry, palette_len, extra_blocks)
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
for extra_block in extra_blocks:
|
|
162
|
-
block_palette_nbt.append(
|
|
163
|
-
generate_block_entry(extra_block, palette_len, extra_blocks)
|
|
164
|
-
)
|
|
165
|
-
return block_palette_nbt
|
|
1
|
+
from typing import List, Union, Type, Dict
|
|
2
|
+
import numpy
|
|
3
|
+
|
|
4
|
+
from amulet_nbt import (
|
|
5
|
+
IntTag,
|
|
6
|
+
DoubleTag,
|
|
7
|
+
StringTag,
|
|
8
|
+
ListTag,
|
|
9
|
+
CompoundTag,
|
|
10
|
+
ByteArrayTag,
|
|
11
|
+
IntArrayTag,
|
|
12
|
+
LongArrayTag,
|
|
13
|
+
NamedTag,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from amulet.api.block import Block
|
|
17
|
+
from amulet.api.entity import Entity
|
|
18
|
+
from amulet.api.block_entity import BlockEntity
|
|
19
|
+
from amulet.api.registry import BlockManager
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def unpack_palette(raw_palette: ListTag) -> List[Block]:
|
|
23
|
+
block_palette = []
|
|
24
|
+
extra_block_map: Dict[int, ListTag[IntTag]] = {}
|
|
25
|
+
for block_index, block_nbt in enumerate(raw_palette):
|
|
26
|
+
block_nbt: CompoundTag
|
|
27
|
+
block = Block(
|
|
28
|
+
namespace=block_nbt.get_string("namespace").py_str,
|
|
29
|
+
base_name=block_nbt.get_string("blockname").py_str,
|
|
30
|
+
properties=block_nbt.get_compound("properties").py_dict,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if block_nbt.get_list("extra_blocks"):
|
|
34
|
+
extra_block_map[block_index] = block_nbt.get_list("extra_blocks")
|
|
35
|
+
|
|
36
|
+
block_palette.append(block)
|
|
37
|
+
|
|
38
|
+
extra_blocks: ListTag[IntTag]
|
|
39
|
+
for block_index, extra_blocks in extra_block_map.items():
|
|
40
|
+
extra_block_objects = [block_palette[i.py_int] for i in extra_blocks]
|
|
41
|
+
|
|
42
|
+
resulting_block = block_palette[block_index]
|
|
43
|
+
for extra_block in extra_block_objects:
|
|
44
|
+
resulting_block = resulting_block + extra_block
|
|
45
|
+
|
|
46
|
+
block_palette[block_index] = resulting_block
|
|
47
|
+
return block_palette
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def parse_entities(entities: ListTag) -> List[Entity]:
|
|
51
|
+
return [
|
|
52
|
+
Entity(
|
|
53
|
+
entity.get_string("namespace").py_str,
|
|
54
|
+
entity.get_string("base_name").py_str,
|
|
55
|
+
entity.get_double("x").py_float,
|
|
56
|
+
entity.get_double("y").py_float,
|
|
57
|
+
entity.get_double("z").py_float,
|
|
58
|
+
NamedTag(entity.get_compound("nbt")),
|
|
59
|
+
)
|
|
60
|
+
for entity in entities
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def parse_block_entities(block_entities: ListTag) -> List[BlockEntity]:
|
|
65
|
+
return [
|
|
66
|
+
BlockEntity(
|
|
67
|
+
block_entity.get_string("namespace").py_str,
|
|
68
|
+
block_entity.get_string("base_name").py_str,
|
|
69
|
+
block_entity.get_int("x").py_int,
|
|
70
|
+
block_entity.get_int("y").py_int,
|
|
71
|
+
block_entity.get_int("z").py_int,
|
|
72
|
+
NamedTag(block_entity.get_compound("nbt")),
|
|
73
|
+
)
|
|
74
|
+
for block_entity in block_entities
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def generate_block_entry(block: Block, palette_len, extra_blocks) -> CompoundTag:
|
|
79
|
+
return CompoundTag(
|
|
80
|
+
{
|
|
81
|
+
"namespace": StringTag(block.namespace),
|
|
82
|
+
"blockname": StringTag(block.base_name),
|
|
83
|
+
"properties": CompoundTag(block.properties),
|
|
84
|
+
"extra_blocks": ListTag(
|
|
85
|
+
[
|
|
86
|
+
IntTag(palette_len + extra_blocks.index(_extra_block))
|
|
87
|
+
for _extra_block in block.extra_blocks
|
|
88
|
+
]
|
|
89
|
+
),
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def serialise_entities(entities: List[Entity]) -> ListTag:
|
|
95
|
+
return ListTag(
|
|
96
|
+
[
|
|
97
|
+
CompoundTag(
|
|
98
|
+
{
|
|
99
|
+
"namespace": StringTag(entity.namespace),
|
|
100
|
+
"base_name": StringTag(entity.base_name),
|
|
101
|
+
"x": DoubleTag(entity.x),
|
|
102
|
+
"y": DoubleTag(entity.y),
|
|
103
|
+
"z": DoubleTag(entity.z),
|
|
104
|
+
"nbt": entity.nbt.compound,
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
for entity in entities
|
|
108
|
+
]
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def serialise_block_entities(
|
|
113
|
+
block_entities: List[BlockEntity],
|
|
114
|
+
) -> ListTag:
|
|
115
|
+
return ListTag(
|
|
116
|
+
[
|
|
117
|
+
CompoundTag(
|
|
118
|
+
{
|
|
119
|
+
"namespace": StringTag(block_entity.namespace),
|
|
120
|
+
"base_name": StringTag(block_entity.base_name),
|
|
121
|
+
"x": IntTag(block_entity.x),
|
|
122
|
+
"y": IntTag(block_entity.y),
|
|
123
|
+
"z": IntTag(block_entity.z),
|
|
124
|
+
"nbt": block_entity.nbt.compound,
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
for block_entity in block_entities
|
|
128
|
+
]
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def find_fitting_array_type(
|
|
133
|
+
array: numpy.ndarray,
|
|
134
|
+
) -> Union[Type[IntArrayTag], Type[ByteArrayTag], Type[LongArrayTag]]:
|
|
135
|
+
max_element = array.max(initial=0)
|
|
136
|
+
|
|
137
|
+
if max_element <= 127:
|
|
138
|
+
return ByteArrayTag
|
|
139
|
+
elif max_element <= 2_147_483_647:
|
|
140
|
+
return IntArrayTag
|
|
141
|
+
else:
|
|
142
|
+
return LongArrayTag
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def pack_palette(palette: BlockManager) -> ListTag:
|
|
146
|
+
block_palette_nbt = ListTag()
|
|
147
|
+
extra_blocks = set()
|
|
148
|
+
|
|
149
|
+
for block in palette.blocks:
|
|
150
|
+
if len(block.extra_blocks) > 0:
|
|
151
|
+
extra_blocks.update(block.extra_blocks)
|
|
152
|
+
|
|
153
|
+
extra_blocks = list(extra_blocks)
|
|
154
|
+
|
|
155
|
+
palette_len = len(palette)
|
|
156
|
+
for block_entry in palette.blocks:
|
|
157
|
+
block_palette_nbt.append(
|
|
158
|
+
generate_block_entry(block_entry, palette_len, extra_blocks)
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
for extra_block in extra_blocks:
|
|
162
|
+
block_palette_nbt.append(
|
|
163
|
+
generate_block_entry(extra_block, palette_len, extra_blocks)
|
|
164
|
+
)
|
|
165
|
+
return block_palette_nbt
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
from .format import LevelDBFormat
|
|
2
|
-
|
|
3
|
-
export = LevelDBFormat
|
|
1
|
+
from .format import LevelDBFormat
|
|
2
|
+
|
|
3
|
+
export = LevelDBFormat
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
from typing import Dict, Union, Iterable, Tuple, List, Optional
|
|
2
|
-
from amulet_nbt import NamedTag
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class ChunkData(Dict[bytes, Optional[bytes]]):
|
|
6
|
-
def __init__(
|
|
7
|
-
self,
|
|
8
|
-
chunk_data: Union[Dict[bytes, bytes], Iterable[Tuple[bytes, bytes]]] = (),
|
|
9
|
-
*,
|
|
10
|
-
entity_actor: Iterable[NamedTag] = (),
|
|
11
|
-
unknown_actor: Iterable[NamedTag] = (),
|
|
12
|
-
):
|
|
13
|
-
super().__init__(chunk_data)
|
|
14
|
-
self._entity_actor = list(entity_actor)
|
|
15
|
-
self._unknown_actor = list(unknown_actor)
|
|
16
|
-
|
|
17
|
-
@property
|
|
18
|
-
def entity_actor(self) -> List[NamedTag]:
|
|
19
|
-
"""
|
|
20
|
-
A list of entity actor data.
|
|
21
|
-
UniqueID is stripped out. internalComponents is stripped out if there is no other data.
|
|
22
|
-
"""
|
|
23
|
-
return self._entity_actor
|
|
24
|
-
|
|
25
|
-
@property
|
|
26
|
-
def unknown_actor(self) -> List[NamedTag]:
|
|
27
|
-
"""
|
|
28
|
-
A list of actor data that does not fit in the known actor types.
|
|
29
|
-
UniqueID is stripped out.
|
|
30
|
-
internalComponents.{StorageKeyComponent}.StorageKey is replaced with a blank string.
|
|
31
|
-
All keys matching this pattern will get replaced with the real storage key when saving (at least one must exist)
|
|
32
|
-
"""
|
|
33
|
-
return self._unknown_actor
|
|
1
|
+
from typing import Dict, Union, Iterable, Tuple, List, Optional
|
|
2
|
+
from amulet_nbt import NamedTag
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ChunkData(Dict[bytes, Optional[bytes]]):
|
|
6
|
+
def __init__(
|
|
7
|
+
self,
|
|
8
|
+
chunk_data: Union[Dict[bytes, bytes], Iterable[Tuple[bytes, bytes]]] = (),
|
|
9
|
+
*,
|
|
10
|
+
entity_actor: Iterable[NamedTag] = (),
|
|
11
|
+
unknown_actor: Iterable[NamedTag] = (),
|
|
12
|
+
):
|
|
13
|
+
super().__init__(chunk_data)
|
|
14
|
+
self._entity_actor = list(entity_actor)
|
|
15
|
+
self._unknown_actor = list(unknown_actor)
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def entity_actor(self) -> List[NamedTag]:
|
|
19
|
+
"""
|
|
20
|
+
A list of entity actor data.
|
|
21
|
+
UniqueID is stripped out. internalComponents is stripped out if there is no other data.
|
|
22
|
+
"""
|
|
23
|
+
return self._entity_actor
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def unknown_actor(self) -> List[NamedTag]:
|
|
27
|
+
"""
|
|
28
|
+
A list of actor data that does not fit in the known actor types.
|
|
29
|
+
UniqueID is stripped out.
|
|
30
|
+
internalComponents.{StorageKeyComponent}.StorageKey is replaced with a blank string.
|
|
31
|
+
All keys matching this pattern will get replaced with the real storage key when saving (at least one must exist)
|
|
32
|
+
"""
|
|
33
|
+
return self._unknown_actor
|