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.

Files changed (198) hide show
  1. amulet/__init__.py +27 -27
  2. amulet/__pyinstaller/__init__.py +2 -2
  3. amulet/__pyinstaller/hook-amulet.py +4 -4
  4. amulet/_version.py +21 -21
  5. amulet/api/__init__.py +2 -2
  6. amulet/api/abstract_base_entity.py +128 -128
  7. amulet/api/block.py +630 -630
  8. amulet/api/block_entity.py +71 -71
  9. amulet/api/cache.py +107 -107
  10. amulet/api/chunk/__init__.py +6 -6
  11. amulet/api/chunk/biomes.py +207 -207
  12. amulet/api/chunk/block_entity_dict.py +175 -175
  13. amulet/api/chunk/blocks.py +46 -46
  14. amulet/api/chunk/chunk.py +389 -389
  15. amulet/api/chunk/entity_list.py +75 -75
  16. amulet/api/chunk/status.py +167 -167
  17. amulet/api/data_types/__init__.py +4 -4
  18. amulet/api/data_types/generic_types.py +4 -4
  19. amulet/api/data_types/operation_types.py +16 -16
  20. amulet/api/data_types/world_types.py +49 -49
  21. amulet/api/data_types/wrapper_types.py +71 -71
  22. amulet/api/entity.py +74 -74
  23. amulet/api/errors.py +119 -119
  24. amulet/api/history/__init__.py +36 -36
  25. amulet/api/history/base/__init__.py +3 -3
  26. amulet/api/history/base/base_history.py +26 -26
  27. amulet/api/history/base/history_manager.py +63 -63
  28. amulet/api/history/base/revision_manager.py +73 -73
  29. amulet/api/history/changeable.py +15 -15
  30. amulet/api/history/data_types.py +7 -7
  31. amulet/api/history/history_manager/__init__.py +3 -3
  32. amulet/api/history/history_manager/container.py +102 -102
  33. amulet/api/history/history_manager/database.py +279 -279
  34. amulet/api/history/history_manager/meta.py +93 -93
  35. amulet/api/history/history_manager/object.py +116 -116
  36. amulet/api/history/revision_manager/__init__.py +2 -2
  37. amulet/api/history/revision_manager/disk.py +33 -33
  38. amulet/api/history/revision_manager/ram.py +12 -12
  39. amulet/api/item.py +75 -75
  40. amulet/api/level/__init__.py +4 -4
  41. amulet/api/level/base_level/__init__.py +1 -1
  42. amulet/api/level/base_level/base_level.py +1035 -1026
  43. amulet/api/level/base_level/chunk_manager.py +227 -227
  44. amulet/api/level/base_level/clone.py +389 -389
  45. amulet/api/level/base_level/player_manager.py +101 -101
  46. amulet/api/level/immutable_structure/__init__.py +1 -1
  47. amulet/api/level/immutable_structure/immutable_structure.py +94 -94
  48. amulet/api/level/immutable_structure/void_format_wrapper.py +117 -117
  49. amulet/api/level/structure.py +22 -22
  50. amulet/api/level/world.py +19 -19
  51. amulet/api/partial_3d_array/__init__.py +2 -2
  52. amulet/api/partial_3d_array/base_partial_3d_array.py +263 -263
  53. amulet/api/partial_3d_array/bounded_partial_3d_array.py +528 -528
  54. amulet/api/partial_3d_array/data_types.py +15 -15
  55. amulet/api/partial_3d_array/unbounded_partial_3d_array.py +229 -229
  56. amulet/api/partial_3d_array/util.py +152 -152
  57. amulet/api/player.py +65 -65
  58. amulet/api/registry/__init__.py +2 -2
  59. amulet/api/registry/base_registry.py +34 -34
  60. amulet/api/registry/biome_manager.py +153 -153
  61. amulet/api/registry/block_manager.py +156 -156
  62. amulet/api/selection/__init__.py +2 -2
  63. amulet/api/selection/abstract_selection.py +315 -315
  64. amulet/api/selection/box.py +805 -805
  65. amulet/api/selection/group.py +488 -488
  66. amulet/api/structure.py +37 -37
  67. amulet/api/wrapper/__init__.py +8 -8
  68. amulet/api/wrapper/chunk/interface.py +441 -441
  69. amulet/api/wrapper/chunk/translator.py +567 -567
  70. amulet/api/wrapper/format_wrapper.py +772 -772
  71. amulet/api/wrapper/structure_format_wrapper.py +116 -116
  72. amulet/api/wrapper/world_format_wrapper.py +63 -63
  73. amulet/level/__init__.py +1 -1
  74. amulet/level/formats/anvil_forge_world.py +40 -40
  75. amulet/level/formats/anvil_world/__init__.py +3 -3
  76. amulet/level/formats/anvil_world/_sector_manager.py +291 -384
  77. amulet/level/formats/anvil_world/data_pack/__init__.py +2 -2
  78. amulet/level/formats/anvil_world/data_pack/data_pack.py +224 -224
  79. amulet/level/formats/anvil_world/data_pack/data_pack_manager.py +77 -77
  80. amulet/level/formats/anvil_world/dimension.py +177 -177
  81. amulet/level/formats/anvil_world/format.py +769 -769
  82. amulet/level/formats/anvil_world/region.py +384 -384
  83. amulet/level/formats/construction/__init__.py +3 -3
  84. amulet/level/formats/construction/format_wrapper.py +515 -515
  85. amulet/level/formats/construction/interface.py +134 -134
  86. amulet/level/formats/construction/section.py +60 -60
  87. amulet/level/formats/construction/util.py +165 -165
  88. amulet/level/formats/leveldb_world/__init__.py +3 -3
  89. amulet/level/formats/leveldb_world/chunk.py +33 -33
  90. amulet/level/formats/leveldb_world/dimension.py +385 -419
  91. amulet/level/formats/leveldb_world/format.py +659 -641
  92. amulet/level/formats/leveldb_world/interface/chunk/__init__.py +36 -36
  93. amulet/level/formats/leveldb_world/interface/chunk/base_leveldb_interface.py +836 -836
  94. amulet/level/formats/leveldb_world/interface/chunk/generate_interface.py +31 -31
  95. amulet/level/formats/leveldb_world/interface/chunk/leveldb_0.py +30 -30
  96. amulet/level/formats/leveldb_world/interface/chunk/leveldb_1.py +12 -12
  97. amulet/level/formats/leveldb_world/interface/chunk/leveldb_10.py +12 -12
  98. amulet/level/formats/leveldb_world/interface/chunk/leveldb_11.py +12 -12
  99. amulet/level/formats/leveldb_world/interface/chunk/leveldb_12.py +12 -12
  100. amulet/level/formats/leveldb_world/interface/chunk/leveldb_13.py +12 -12
  101. amulet/level/formats/leveldb_world/interface/chunk/leveldb_14.py +12 -12
  102. amulet/level/formats/leveldb_world/interface/chunk/leveldb_15.py +12 -12
  103. amulet/level/formats/leveldb_world/interface/chunk/leveldb_16.py +12 -12
  104. amulet/level/formats/leveldb_world/interface/chunk/leveldb_17.py +12 -12
  105. amulet/level/formats/leveldb_world/interface/chunk/leveldb_18.py +12 -12
  106. amulet/level/formats/leveldb_world/interface/chunk/leveldb_19.py +12 -12
  107. amulet/level/formats/leveldb_world/interface/chunk/leveldb_2.py +12 -12
  108. amulet/level/formats/leveldb_world/interface/chunk/leveldb_20.py +12 -12
  109. amulet/level/formats/leveldb_world/interface/chunk/leveldb_21.py +12 -12
  110. amulet/level/formats/leveldb_world/interface/chunk/leveldb_22.py +12 -12
  111. amulet/level/formats/leveldb_world/interface/chunk/leveldb_23.py +10 -10
  112. amulet/level/formats/leveldb_world/interface/chunk/leveldb_24.py +10 -10
  113. amulet/level/formats/leveldb_world/interface/chunk/leveldb_25.py +24 -24
  114. amulet/level/formats/leveldb_world/interface/chunk/leveldb_26.py +10 -10
  115. amulet/level/formats/leveldb_world/interface/chunk/leveldb_27.py +10 -10
  116. amulet/level/formats/leveldb_world/interface/chunk/leveldb_28.py +10 -10
  117. amulet/level/formats/leveldb_world/interface/chunk/leveldb_29.py +33 -33
  118. amulet/level/formats/leveldb_world/interface/chunk/leveldb_3.py +57 -57
  119. amulet/level/formats/leveldb_world/interface/chunk/leveldb_30.py +10 -10
  120. amulet/level/formats/leveldb_world/interface/chunk/leveldb_31.py +10 -10
  121. amulet/level/formats/leveldb_world/interface/chunk/leveldb_32.py +10 -10
  122. amulet/level/formats/leveldb_world/interface/chunk/leveldb_33.py +10 -10
  123. amulet/level/formats/leveldb_world/interface/chunk/leveldb_34.py +10 -10
  124. amulet/level/formats/leveldb_world/interface/chunk/leveldb_35.py +10 -10
  125. amulet/level/formats/leveldb_world/interface/chunk/leveldb_36.py +10 -10
  126. amulet/level/formats/leveldb_world/interface/chunk/leveldb_37.py +10 -10
  127. amulet/level/formats/leveldb_world/interface/chunk/leveldb_38.py +10 -10
  128. amulet/level/formats/leveldb_world/interface/chunk/leveldb_39.py +12 -12
  129. amulet/level/formats/leveldb_world/interface/chunk/leveldb_4.py +12 -12
  130. amulet/level/formats/leveldb_world/interface/chunk/leveldb_40.py +16 -16
  131. amulet/level/formats/leveldb_world/interface/chunk/leveldb_5.py +12 -12
  132. amulet/level/formats/leveldb_world/interface/chunk/leveldb_6.py +12 -12
  133. amulet/level/formats/leveldb_world/interface/chunk/leveldb_7.py +12 -12
  134. amulet/level/formats/leveldb_world/interface/chunk/leveldb_8.py +180 -180
  135. amulet/level/formats/leveldb_world/interface/chunk/leveldb_9.py +18 -18
  136. amulet/level/formats/leveldb_world/interface/chunk/leveldb_chunk_versions.py +79 -79
  137. amulet/level/formats/mcstructure/__init__.py +3 -3
  138. amulet/level/formats/mcstructure/chunk.py +50 -50
  139. amulet/level/formats/mcstructure/format_wrapper.py +408 -408
  140. amulet/level/formats/mcstructure/interface.py +175 -175
  141. amulet/level/formats/schematic/__init__.py +3 -3
  142. amulet/level/formats/schematic/chunk.py +55 -55
  143. amulet/level/formats/schematic/data_types.py +4 -4
  144. amulet/level/formats/schematic/format_wrapper.py +373 -373
  145. amulet/level/formats/schematic/interface.py +142 -142
  146. amulet/level/formats/sponge_schem/__init__.py +4 -4
  147. amulet/level/formats/sponge_schem/chunk.py +62 -62
  148. amulet/level/formats/sponge_schem/format_wrapper.py +463 -463
  149. amulet/level/formats/sponge_schem/interface.py +118 -118
  150. amulet/level/formats/sponge_schem/varint/__init__.py +1 -1
  151. amulet/level/formats/sponge_schem/varint/varint.py +87 -87
  152. amulet/level/interfaces/chunk/anvil/anvil_0.py +72 -72
  153. amulet/level/interfaces/chunk/anvil/anvil_1444.py +336 -336
  154. amulet/level/interfaces/chunk/anvil/anvil_1466.py +94 -94
  155. amulet/level/interfaces/chunk/anvil/anvil_1467.py +37 -37
  156. amulet/level/interfaces/chunk/anvil/anvil_1484.py +20 -20
  157. amulet/level/interfaces/chunk/anvil/anvil_1503.py +20 -20
  158. amulet/level/interfaces/chunk/anvil/anvil_1519.py +34 -34
  159. amulet/level/interfaces/chunk/anvil/anvil_1901.py +20 -20
  160. amulet/level/interfaces/chunk/anvil/anvil_1908.py +20 -20
  161. amulet/level/interfaces/chunk/anvil/anvil_1912.py +21 -21
  162. amulet/level/interfaces/chunk/anvil/anvil_1934.py +20 -20
  163. amulet/level/interfaces/chunk/anvil/anvil_2203.py +69 -69
  164. amulet/level/interfaces/chunk/anvil/anvil_2529.py +19 -19
  165. amulet/level/interfaces/chunk/anvil/anvil_2681.py +76 -76
  166. amulet/level/interfaces/chunk/anvil/anvil_2709.py +19 -19
  167. amulet/level/interfaces/chunk/anvil/anvil_2844.py +267 -267
  168. amulet/level/interfaces/chunk/anvil/anvil_3463.py +19 -19
  169. amulet/level/interfaces/chunk/anvil/anvil_na.py +607 -607
  170. amulet/level/interfaces/chunk/anvil/base_anvil_interface.py +326 -326
  171. amulet/level/load.py +59 -59
  172. amulet/level/loader.py +95 -95
  173. amulet/level/translators/chunk/bedrock/__init__.py +267 -267
  174. amulet/level/translators/chunk/bedrock/bedrock_nbt_blockstate_translator.py +46 -46
  175. amulet/level/translators/chunk/bedrock/bedrock_numerical_translator.py +39 -39
  176. amulet/level/translators/chunk/bedrock/bedrock_psudo_numerical_translator.py +37 -37
  177. amulet/level/translators/chunk/java/java_1_18_translator.py +40 -40
  178. amulet/level/translators/chunk/java/java_blockstate_translator.py +94 -94
  179. amulet/level/translators/chunk/java/java_numerical_translator.py +62 -62
  180. amulet/libs/leveldb/__init__.py +7 -7
  181. amulet/operations/__init__.py +5 -5
  182. amulet/operations/clone.py +18 -18
  183. amulet/operations/delete_chunk.py +32 -32
  184. amulet/operations/fill.py +30 -30
  185. amulet/operations/paste.py +65 -65
  186. amulet/operations/replace.py +58 -58
  187. amulet/utils/__init__.py +14 -14
  188. amulet/utils/format_utils.py +41 -41
  189. amulet/utils/generator.py +15 -15
  190. amulet/utils/matrix.py +243 -243
  191. amulet/utils/numpy_helpers.py +46 -46
  192. amulet/utils/world_utils.py +349 -349
  193. {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/METADATA +97 -97
  194. amulet_core-1.9.20.dist-info/RECORD +208 -0
  195. amulet_core-1.9.19.dist-info/RECORD +0 -208
  196. {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/WHEEL +0 -0
  197. {amulet_core-1.9.19.dist-info → amulet_core-1.9.20.dist-info}/entry_points.txt +0 -0
  198. {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