amulet-core 1.9.20__py3-none-any.whl → 1.9.22__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.
amulet/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2023-09-29T11:29:40+0100",
11
+ "date": "2024-04-29T13:55:26+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "b673f749bf1c348e31bf0594e71ffa30f6ea8519",
15
- "version": "1.9.20"
14
+ "full-revisionid": "ac72c15417c9bd86d9332d7a6488311ad1cb30ab",
15
+ "version": "1.9.22"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -153,9 +153,9 @@ class DatabaseHistoryManager(ContainerHistoryManager):
153
153
  ].get_current_entry()
154
154
  else:
155
155
  # If it has not been loaded request it from the raw database.
156
- entry = self._temporary_database[
157
- key
158
- ] = self._get_register_original_entry(key)
156
+ entry = self._temporary_database[key] = (
157
+ self._get_register_original_entry(key)
158
+ )
159
159
  if entry is None:
160
160
  raise self.DoesNotExistError
161
161
  return entry
@@ -116,13 +116,13 @@ def clone(
116
116
  )
117
117
 
118
118
  last_src: Optional[Tuple[int, int]] = None
119
- src_chunk: Optional[
120
- Chunk
121
- ] = None # None here means the chunk does not exist or failed to load. Treat it as if it was air.
119
+ src_chunk: Optional[Chunk] = (
120
+ None # None here means the chunk does not exist or failed to load. Treat it as if it was air.
121
+ )
122
122
  last_dst: Optional[Tuple[int, int]] = None
123
- dst_chunk: Optional[
124
- Chunk
125
- ] = None # None here means the chunk failed to load. Do not modify it.
123
+ dst_chunk: Optional[Chunk] = (
124
+ None # None here means the chunk failed to load. Do not modify it.
125
+ )
126
126
 
127
127
  sum_progress = 0
128
128
  volumes = tuple(
@@ -252,8 +252,7 @@ class BoundedPartial3DArray(BasePartial3DArray):
252
252
  @overload
253
253
  def __getitem__(
254
254
  self, slices: Tuple[IntegerType, IntegerType, IntegerType]
255
- ) -> Union[int, bool]:
256
- ...
255
+ ) -> Union[int, bool]: ...
257
256
 
258
257
  @overload
259
258
  def __getitem__(
@@ -263,14 +262,12 @@ class BoundedPartial3DArray(BasePartial3DArray):
263
262
  Union[IntegerType, slice],
264
263
  Union[IntegerType, slice],
265
264
  ],
266
- ) -> "BoundedPartial3DArray":
267
- ...
265
+ ) -> "BoundedPartial3DArray": ...
268
266
 
269
267
  @overload
270
268
  def __getitem__(
271
269
  self, slices: Union[numpy.ndarray, "BoundedPartial3DArray"]
272
- ) -> numpy.ndarray:
273
- ...
270
+ ) -> numpy.ndarray: ...
274
271
 
275
272
  def __getitem__(self, item):
276
273
  """
@@ -386,16 +383,14 @@ class BoundedPartial3DArray(BasePartial3DArray):
386
383
  Union[IntegerType, slice],
387
384
  ],
388
385
  value: Union[int, bool, numpy.ndarray, "BoundedPartial3DArray"],
389
- ):
390
- ...
386
+ ): ...
391
387
 
392
388
  @overload
393
389
  def __setitem__(
394
390
  self,
395
391
  item: Union[numpy.ndarray, "BoundedPartial3DArray"],
396
392
  value: Union[int, bool, numpy.ndarray],
397
- ):
398
- ...
393
+ ): ...
399
394
 
400
395
  def __setitem__(self, item, value):
401
396
  """
@@ -141,8 +141,9 @@ class UnboundedPartial3DArray(BasePartial3DArray):
141
141
  self[slices][:, :, :] = value
142
142
 
143
143
  @overload
144
- def __getitem__(self, slices: Tuple[IntegerType, IntegerType, IntegerType]) -> int:
145
- ...
144
+ def __getitem__(
145
+ self, slices: Tuple[IntegerType, IntegerType, IntegerType]
146
+ ) -> int: ...
146
147
 
147
148
  @overload
148
149
  def __getitem__(
@@ -152,8 +153,7 @@ class UnboundedPartial3DArray(BasePartial3DArray):
152
153
  Union[IntegerType, slice],
153
154
  Union[IntegerType, slice],
154
155
  ],
155
- ) -> "BoundedPartial3DArray":
156
- ...
156
+ ) -> "BoundedPartial3DArray": ...
157
157
 
158
158
  def __getitem__(self, item):
159
159
  """
@@ -80,18 +80,15 @@ class BiomeManager(BaseRegistry):
80
80
  yield from enumerate(self._index_to_biome)
81
81
 
82
82
  @overload
83
- def __getitem__(self, item: BiomeType) -> int:
84
- ...
83
+ def __getitem__(self, item: BiomeType) -> int: ...
85
84
 
86
85
  @overload
87
- def __getitem__(self, item: Int) -> BiomeType:
88
- ...
86
+ def __getitem__(self, item: Int) -> BiomeType: ...
89
87
 
90
88
  @overload
91
89
  def __getitem__(
92
90
  self, item: Iterable[Union[Int, BiomeType]]
93
- ) -> List[Union[BiomeType, Int]]:
94
- ...
91
+ ) -> List[Union[BiomeType, Int]]: ...
95
92
 
96
93
  def __getitem__(self, item):
97
94
  """
@@ -82,16 +82,15 @@ class BlockManager(BaseRegistry):
82
82
  yield from enumerate(self._index_to_block)
83
83
 
84
84
  @overload
85
- def __getitem__(self, item: Block) -> int:
86
- ...
85
+ def __getitem__(self, item: Block) -> int: ...
87
86
 
88
87
  @overload
89
- def __getitem__(self, item: Int) -> Block:
90
- ...
88
+ def __getitem__(self, item: Int) -> Block: ...
91
89
 
92
90
  @overload
93
- def __getitem__(self, item: Iterable[Union[Int, Block]]) -> List[Union[Block, Int]]:
94
- ...
91
+ def __getitem__(
92
+ self, item: Iterable[Union[Int, Block]]
93
+ ) -> List[Union[Block, Int]]: ...
95
94
 
96
95
  def __getitem__(self, item):
97
96
  """
@@ -599,9 +599,7 @@ class SelectionBox(AbstractBaseSelection):
599
599
  points_array.T,
600
600
  ).T[:, :3]
601
601
 
602
- def _iter_transformed_boxes(
603
- self, transform: numpy.ndarray
604
- ) -> Generator[
602
+ def _iter_transformed_boxes(self, transform: numpy.ndarray) -> Generator[
605
603
  Tuple[
606
604
  float, # progress
607
605
  SelectionBox, # The sub-chunk box.
@@ -136,12 +136,10 @@ class SelectionGroup(AbstractBaseSelection):
136
136
  return bool(self._selection_boxes)
137
137
 
138
138
  @overload
139
- def __getitem__(self, item: int) -> SelectionBox:
140
- ...
139
+ def __getitem__(self, item: int) -> SelectionBox: ...
141
140
 
142
141
  @overload
143
- def __getitem__(self, item: slice) -> SelectionGroup:
144
- ...
142
+ def __getitem__(self, item: slice) -> SelectionGroup: ...
145
143
 
146
144
  def __getitem__(self, item):
147
145
  """Get the selection box at the given index."""
@@ -276,13 +276,11 @@ class Interface(ABC):
276
276
 
277
277
  @overload
278
278
  @staticmethod
279
- def check_type(obj: CompoundTag, key: str, dtype: Type[AnyNBT]) -> bool:
280
- ...
279
+ def check_type(obj: CompoundTag, key: str, dtype: Type[AnyNBT]) -> bool: ...
281
280
 
282
281
  @overload
283
282
  @staticmethod
284
- def check_type(obj: ListTag, key: int, dtype: Type[AnyNBT]) -> bool:
285
- ...
283
+ def check_type(obj: ListTag, key: int, dtype: Type[AnyNBT]) -> bool: ...
286
284
 
287
285
  @staticmethod
288
286
  def check_type(
@@ -298,8 +296,7 @@ class Interface(ABC):
298
296
  key: str,
299
297
  dtype: Type[AnyNBT],
300
298
  default: Optional[AnyNBT] = None,
301
- ) -> Optional[AnyNBT]:
302
- ...
299
+ ) -> Optional[AnyNBT]: ...
303
300
 
304
301
  @overload
305
302
  def get_obj(
@@ -308,8 +305,7 @@ class Interface(ABC):
308
305
  key: int,
309
306
  dtype: Type[AnyNBT],
310
307
  default: Optional[AnyNBT] = None,
311
- ) -> Optional[AnyNBT]:
312
- ...
308
+ ) -> Optional[AnyNBT]: ...
313
309
 
314
310
  def get_obj(
315
311
  self, obj, key, dtype: Type[AnyNBT], default: Optional[AnyNBT] = None
@@ -27,6 +27,7 @@ import PyMCTranslate
27
27
  from amulet.api import level as api_level, wrapper as api_wrapper
28
28
  from amulet.api.chunk import Chunk
29
29
  from amulet.api.registry import BlockManager
30
+ from amulet.api.block import UniversalAirBlock
30
31
  from amulet.api.errors import (
31
32
  ChunkLoadError,
32
33
  ChunkDoesNotExist,
@@ -621,6 +622,7 @@ class FormatWrapper(Generic[VersionNumberT], ABC):
621
622
  )
622
623
  else:
623
624
  chunk._block_palette = BlockManager()
625
+ chunk._block_palette.get_add_block(UniversalAirBlock)
624
626
 
625
627
  def get_chunk_callback(_: int, __: int) -> Chunk:
626
628
  # conversion from universal should not require any data outside the block
@@ -24,6 +24,7 @@ import portalocker
24
24
  from amulet_nbt import (
25
25
  IntTag,
26
26
  LongTag,
27
+ FloatTag,
27
28
  DoubleTag,
28
29
  StringTag,
29
30
  ListTag,
@@ -728,7 +729,7 @@ class AnvilFormat(WorldFormatWrapper[VersionNumberInt]):
728
729
  if (
729
730
  isinstance(rot_data, ListTag)
730
731
  and len(rot_data) == 2
731
- and rot_data.list_data_type == DoubleTag.tag_id
732
+ and rot_data.list_data_type == FloatTag.tag_id
732
733
  ):
733
734
  rotation = tuple(map(float, rot_data))
734
735
  rotation = tuple(
@@ -12,6 +12,7 @@ import re
12
12
  import threading
13
13
  import logging
14
14
  from enum import IntEnum
15
+ import lz4.block as lz4_block
15
16
 
16
17
  from amulet_nbt import NamedTag, load as load_nbt
17
18
 
@@ -33,6 +34,7 @@ class RegionFileVersion(IntEnum):
33
34
  VERSION_GZIP = 1
34
35
  VERSION_DEFLATE = 2
35
36
  VERSION_NONE = 3
37
+ VERSION_LZ4 = 4
36
38
 
37
39
 
38
40
  def _validate_region_coords(cx: int, cz: int):
@@ -47,6 +49,50 @@ def _compress(data: NamedTag) -> bytes:
47
49
  return b"\x02" + zlib.compress(data)
48
50
 
49
51
 
52
+ LZ4_HEADER = struct.Struct("<8sBiii")
53
+ LZ4_MAGIC = b"LZ4Block"
54
+ COMPRESSION_METHOD_RAW = 0x10
55
+ COMPRESSION_METHOD_LZ4 = 0x20
56
+
57
+
58
+ def _decompress_lz4(data: bytes) -> bytes:
59
+ """The LZ4 compression format is a sequence of LZ4 blocks with some header data."""
60
+ # https://github.com/lz4/lz4-java/blob/7c931bef32d179ec3d3286ee71638b23ebde3459/src/java/net/jpountz/lz4/LZ4BlockInputStream.java#L200
61
+ decompressed: list[bytes] = []
62
+ index = 0
63
+ while index < len(data):
64
+ magic, token, compressed_length, original_length, checksum = LZ4_HEADER.unpack(
65
+ data[index : index + LZ4_HEADER.size]
66
+ )
67
+ index += LZ4_HEADER.size
68
+ compression_method = token & 0xF0
69
+ if (
70
+ magic != LZ4_MAGIC
71
+ or original_length < 0
72
+ or compressed_length < 0
73
+ or (original_length == 0 and compressed_length != 0)
74
+ or (original_length != 0 and compressed_length == 0)
75
+ or (
76
+ compression_method == COMPRESSION_METHOD_RAW
77
+ and original_length != compressed_length
78
+ )
79
+ ):
80
+ raise ValueError("LZ4 compressed block is corrupted.")
81
+ if compression_method == COMPRESSION_METHOD_RAW:
82
+ decompressed.append(data[index : index + original_length])
83
+ index += original_length
84
+ elif compression_method == COMPRESSION_METHOD_LZ4:
85
+ decompressed.append(
86
+ lz4_block.decompress(
87
+ data[index : index + compressed_length], original_length
88
+ )
89
+ )
90
+ index += compressed_length
91
+ else:
92
+ raise ValueError("LZ4 compressed block is corrupted.")
93
+ return b"".join(decompressed)
94
+
95
+
50
96
  def _decompress(data: bytes) -> NamedTag:
51
97
  """Convert a bytes object into an NBTFile"""
52
98
  compress_type, data = data[0], data[1:]
@@ -56,6 +102,8 @@ def _decompress(data: bytes) -> NamedTag:
56
102
  return load_nbt(zlib.decompress(data), compressed=False)
57
103
  elif compress_type == RegionFileVersion.VERSION_NONE:
58
104
  return load_nbt(data, compressed=False)
105
+ elif compress_type == RegionFileVersion.VERSION_LZ4:
106
+ return load_nbt(_decompress_lz4(data), compressed=False)
59
107
  raise ChunkLoadError(f"Invalid compression type {compress_type}")
60
108
 
61
109
 
@@ -371,9 +371,9 @@ class ConstructionFormatWrapper(StructureFormatWrapper[VersionNumberTuple]):
371
371
  ),
372
372
  }
373
373
  )
374
- section_index_table: List[
375
- Tuple[int, int, int, int, int, int, int, int]
376
- ] = []
374
+ section_index_table: List[Tuple[int, int, int, int, int, int, int, int]] = (
375
+ []
376
+ )
377
377
  if self._section_version == 0:
378
378
  for section_list in self._chunk_to_section.values():
379
379
  for section in section_list:
@@ -172,9 +172,9 @@ class LevelDBDimensionManager:
172
172
  with suppress(KeyError):
173
173
  digp_key = b"digp" + prefix
174
174
  digp = self._db.get(digp_key)
175
- chunk_data[
176
- b"digp"
177
- ] = b"" # The presence of this key signals to the put method that this should be created and written
175
+ chunk_data[b"digp"] = (
176
+ b"" # The presence of this key signals to the put method that this should be created and written
177
+ )
178
178
  for i in range(0, (len(digp) // 8) * 8, 8):
179
179
  actor_key = b"actorprefix" + digp[i : i + 8]
180
180
  try:
@@ -135,9 +135,9 @@ class BaseLevelDBInterface(Interface):
135
135
  for key in chunk_data.copy().keys():
136
136
  if len(key) == 2 and key[0:1] == b"\x2F":
137
137
  cy = struct.unpack("b", key[1:2])[0]
138
- subchunks[
139
- self._chunk_key_to_sub_chunk(cy, bounds[0] >> 4)
140
- ] = chunk_data.pop(key)
138
+ subchunks[self._chunk_key_to_sub_chunk(cy, bounds[0] >> 4)] = (
139
+ chunk_data.pop(key)
140
+ )
141
141
  chunk.blocks, chunk_palette = self._load_subchunks(subchunks)
142
142
  elif self._features["terrain"] == "30array":
143
143
  section_data = chunk_data.pop(b"\x30", None)
@@ -274,9 +274,9 @@ class BaseLevelDBInterface(Interface):
274
274
  )
275
275
  min_y = bounds[0] // 16
276
276
  for cy, sub_chunk in terrain.items():
277
- chunk_data[
278
- b"\x2F" + self._get_sub_chunk_storage_byte(cy, min_y)
279
- ] = sub_chunk
277
+ chunk_data[b"\x2F" + self._get_sub_chunk_storage_byte(cy, min_y)] = (
278
+ sub_chunk
279
+ )
280
280
 
281
281
  # chunk status
282
282
  if self._features["finalised_state"] == "int0-2":
@@ -71,11 +71,6 @@ class MCStructureFormatWrapper(StructureFormatWrapper[VersionNumberTuple]):
71
71
  ):
72
72
  if not overwrite and os.path.isfile(self.path):
73
73
  raise ObjectWriteError(f"There is already a file at {self.path}")
74
- translator_version = self.translation_manager.get_version(
75
- "bedrock", (999, 999, 999)
76
- )
77
- self._platform = translator_version.platform
78
- self._version = translator_version.version_number
79
74
  self._chunks = {}
80
75
  self._set_selection(bounds)
81
76
  self._is_open = True
@@ -322,9 +322,7 @@ class SpongeSchemFormatWrapper(StructureFormatWrapper[VersionNumberInt]):
322
322
  raise SpongeSchemWriteError(
323
323
  "The structure is too large to be exported to a Sponge Schematic file. It must be 2^16 - 1 at most in each dimension."
324
324
  )
325
- overflowed_shape = [
326
- s if s < 2**15 else s - 2**16 for s in selection.shape
327
- ]
325
+ overflowed_shape = [s if s < 2**15 else s - 2**16 for s in selection.shape]
328
326
  tag = CompoundTag(
329
327
  {
330
328
  "Version": IntTag(2),
@@ -13,7 +13,7 @@ class Anvil3463Interface(ParentInterface):
13
13
 
14
14
  @staticmethod
15
15
  def minor_is_valid(key: int):
16
- return 3454 <= key < 3580
16
+ return 3454 <= key <= 3900
17
17
 
18
18
 
19
19
  export = Anvil3463Interface
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: amulet-core
3
- Version: 1.9.20
3
+ Version: 1.9.22
4
4
  Summary: A Python library for reading/writing Minecraft's various save formats.
5
5
  Home-page: https://www.amuletmc.com
6
6
  Author: James Clare, Ben Gothard et al.
@@ -16,6 +16,7 @@ Requires-Dist: pymctranslate ~=1.2
16
16
  Requires-Dist: portalocker ~=2.4
17
17
  Requires-Dist: amulet-leveldb ~=1.0b0
18
18
  Requires-Dist: platformdirs ~=3.1
19
+ Requires-Dist: lz4 ~=4.3
19
20
  Provides-Extra: dev
20
21
  Requires-Dist: black >=22.3 ; extra == 'dev'
21
22
  Requires-Dist: pre-commit >=1.11.1 ; extra == 'dev'
@@ -1,5 +1,5 @@
1
1
  amulet/__init__.py,sha256=sWKAqhofjzTINMJB22nXeBTITznt4H9rM3ZaaAn2SB4,866
2
- amulet/_version.py,sha256=gUdgVfmYy5twLboNe4_FGwrJzp6s23bhMPNOnXdLQJQ,498
2
+ amulet/_version.py,sha256=twBWv29M0ARlZrctWSYbZAh4QkCPN47RVvdbf3-7MD8,498
3
3
  amulet/__pyinstaller/__init__.py,sha256=JJOm9J0BoU_vwoYyoHgd8vwSdiO5SGlHHWH6EQK6sc4,41
4
4
  amulet/__pyinstaller/hook-amulet.py,sha256=5s6LZxxd47zNsrsJi-PORR7Q6QC079D7pcTkSn1uzCs,158
5
5
  amulet/api/__init__.py,sha256=HJ88KU13JNYES9sptkz0la0OsoRvBGUavuOanaZ_RyM,46
@@ -33,7 +33,7 @@ amulet/api/history/base/history_manager.py,sha256=_0jpO_mDABXYsEuNui5m7SQ4cAt-rB
33
33
  amulet/api/history/base/revision_manager.py,sha256=pfIUWG-0jb6m_EV4ZTs_Eblr_OP01YCFA0uaitrtezo,2816
34
34
  amulet/api/history/history_manager/__init__.py,sha256=iM4WgmNwRNevkPVWJysjhkDEyVNnU4iMronoDpyRwKk,123
35
35
  amulet/api/history/history_manager/container.py,sha256=AJ4k2B927UYI3phKrgXv8gNIjLBRYyzuc4itTgYIVGQ,3480
36
- amulet/api/history/history_manager/database.py,sha256=RfjUnkVfTuSrb0dISHdP7vTWMeusCaFroZUxALWQ7Ow,11327
36
+ amulet/api/history/history_manager/database.py,sha256=8rl-dkx0TJjUPG1f8UsZ50VIqL8f-DJfZYywtm_Bly0,11329
37
37
  amulet/api/history/history_manager/meta.py,sha256=zCbQ4HwzK5xMl9PkNwFqva-ED4YSz9X2IdO7BXHIXGc,3023
38
38
  amulet/api/history/history_manager/object.py,sha256=qieOnvxa06RW_qm_LJqKtoH1AD45V3ikrKeZvptheAo,4064
39
39
  amulet/api/history/revision_manager/__init__.py,sha256=SkjICZ_KMwQO_uALB9Zs17457L29yhwgGLAPY5MLI54,72
@@ -45,31 +45,31 @@ amulet/api/level/world.py,sha256=HpKe4uvV5Ar2RaNf59wuP5tsxJmComMMNHpnjYAT7_Y,613
45
45
  amulet/api/level/base_level/__init__.py,sha256=Gix697NJxsR4zuYf-Q5Rj2IgrWWMpKvqQTfSc4TVuEY,34
46
46
  amulet/api/level/base_level/base_level.py,sha256=Sfd0Qgu-xGasJO9aLpMFmf68DjMSt6J3w6nmTIsOcSU,43619
47
47
  amulet/api/level/base_level/chunk_manager.py,sha256=Dru933TSAmH3bklVulVvwxyp4VGFa2CHZvjmkDzmLZM,8921
48
- amulet/api/level/base_level/clone.py,sha256=1CxmXha7i6Vlz7QOUY4K3q3zbd6l0SqF-ppvB12VHvc,19543
48
+ amulet/api/level/base_level/clone.py,sha256=9EZ2XYdSHoTjuKUDv-RfVj3TMy_laZUqYIME4XH-3CM,19547
49
49
  amulet/api/level/base_level/player_manager.py,sha256=ecx4AXAWGxuVG5zaQ_lS2Mr-O0VQu685n3KneTkV4nA,3226
50
50
  amulet/api/level/immutable_structure/__init__.py,sha256=26iNSRV6Aj-XNpDQtLVURtVks9ogFnl1fTfsysUjDQ0,52
51
51
  amulet/api/level/immutable_structure/immutable_structure.py,sha256=Z8Pu6zblG3wVK3jjtppPZeey3r91822vI3Y4uMmpC10,3302
52
52
  amulet/api/level/immutable_structure/void_format_wrapper.py,sha256=D82pR6wQDgHtLFlV5L5JcPuGJPtzJzsbbTc_YjQj2uc,3065
53
53
  amulet/api/partial_3d_array/__init__.py,sha256=CFPK3ac8yspJwe5UfoPiohjZjIO1jN3amaNnKbga-5Q,124
54
54
  amulet/api/partial_3d_array/base_partial_3d_array.py,sha256=qQGH500EJCnwt4umyF6iwUkzOBoSwTuX8SjTDQLunD8,9215
55
- amulet/api/partial_3d_array/bounded_partial_3d_array.py,sha256=Hy6kAHs58mAxLuTU9erhb4xTMp24TcjHnc_0pTjMCf0,21753
55
+ amulet/api/partial_3d_array/bounded_partial_3d_array.py,sha256=nnRo7iT16FmDWUc7kfXtep_PxGUlx61Kr7EuYdYvoUk,21713
56
56
  amulet/api/partial_3d_array/data_types.py,sha256=hqNDQvSqczOpk8qFTBhAJCu4pPqvZqgUNb6S9zewDUc,547
57
- amulet/api/partial_3d_array/unbounded_partial_3d_array.py,sha256=IbGInL9o4aECe389gTOjGb5fid3s11ofUarX9rgp_v8,9270
57
+ amulet/api/partial_3d_array/unbounded_partial_3d_array.py,sha256=TsApbeiSOxU-u3xbOWOgVPx3fSmkJ5ori1bJ55kXAv0,9268
58
58
  amulet/api/partial_3d_array/util.py,sha256=ItvIsiF8aX9LBgQPTi0zD2gwfrnr_pi7gN5cqBG8TdQ,3969
59
59
  amulet/api/registry/__init__.py,sha256=Rc8owvBGLoc9MIxcFH9AQ-Cf7oerxsrM27asvgPynK8,80
60
60
  amulet/api/registry/base_registry.py,sha256=45B-Odw11xMuPRx3j3cEDwvuen4tFgyzJrpXE--P6HQ,835
61
- amulet/api/registry/biome_manager.py,sha256=60gkVeBv1ow0JKoLaO3g1ofpqXZCidgAxaJatBwFVGc,5157
62
- amulet/api/registry/block_manager.py,sha256=49rF9El6l61JMNpUxqsG9KCiCvyCae_I4HrJ1WILcvo,4957
61
+ amulet/api/registry/biome_manager.py,sha256=H5YV91AXFKvGZ813Hk2eb01EAxULYSpWkLgDbhWoJC0,5133
62
+ amulet/api/registry/block_manager.py,sha256=kDPb33gq3Vrc_ruUx1JGJNaUDok6AzwjNllLZkoavvQ,4947
63
63
  amulet/api/selection/__init__.py,sha256=1Jz5hMJ-4nQIYHq0hsz-rFighmjIILC4hwVNsrJZ5X0,64
64
64
  amulet/api/selection/abstract_selection.py,sha256=yv1PdZdE5TWv0FlsDv-5IrodgBS2vfolDtVEqh8sRcY,8433
65
- amulet/api/selection/box.py,sha256=p4aiuaQuABRXPzien9UiXtwJGOVp-s55fV1Z0NevFt4,30066
66
- amulet/api/selection/group.py,sha256=-SmR5n9Z0ysjl7EnXFAaYTJjMRHmON495dnb5ZPBkGk,18513
65
+ amulet/api/selection/box.py,sha256=RqTPU5lDGutjoRJpGK4P8j50QYHjqMpbZQO4DLFqU-s,30052
66
+ amulet/api/selection/group.py,sha256=agDjy1g8D-CsCZZBf7h3GKZRoVEkoxxWUZBwVVzRWTk,18497
67
67
  amulet/api/wrapper/__init__.py,sha256=5xZQbBkJOHZlaWf3uutlXWGBCUnTH-FfbeJ8JqScTl8,388
68
- amulet/api/wrapper/format_wrapper.py,sha256=I0lUQcnh-bNQ1tVSb5UAGRrByKpSzGEwQVzOLF-7fPk,26009
68
+ amulet/api/wrapper/format_wrapper.py,sha256=nhCMtiaLpfGgSVB0aMSPRFrBIilWHA429_yYZIbUD1I,26122
69
69
  amulet/api/wrapper/structure_format_wrapper.py,sha256=RRLcsZxDl56PHXnU-_MsE47okKZWlafvtXWcVNGBFUs,3674
70
70
  amulet/api/wrapper/world_format_wrapper.py,sha256=KH4eEuWIk2dapE17qQEW1hUhQPLp8CfxHVgF89nHeqk,1646
71
71
  amulet/api/wrapper/chunk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- amulet/api/wrapper/chunk/interface.py,sha256=0o1j2Wro4Lp-xWI9NR63rXImH_hwdIrZZEbYv5_GdD4,14692
72
+ amulet/api/wrapper/chunk/interface.py,sha256=DKmhHDfQIh2MkU45VzBklXp59it2kJsD5BzYItDVepE,14660
73
73
  amulet/api/wrapper/chunk/translator.py,sha256=jKG6Dsel1FNycQ4KE5vvZJDuAsw1QHahLaFEtnsm6n8,22232
74
74
  amulet/img/missing_world_icon.png,sha256=CbkqmFIKvdlDRIYrr_DpGtdlaabJGFbT5pmFYUzocTg,32841
75
75
  amulet/level/__init__.py,sha256=BlvUUE_JQPg8P10UqY_twyu_kDZNW9dcnsNs1a0sNL4,42
@@ -80,23 +80,23 @@ amulet/level/formats/anvil_forge_world.py,sha256=oktfFzj7YYzCdpHJeRKPp-XAR6EzGIp
80
80
  amulet/level/formats/anvil_world/__init__.py,sha256=QlLF_96Ub9ceibhR8J1CVfkSaAqXl8dUQWWxFjDJkW0,54
81
81
  amulet/level/formats/anvil_world/_sector_manager.py,sha256=QK-M9C4j_QfcpBxd_GwmUeQbwpnTgc6TC6egqtB4ZP8,11080
82
82
  amulet/level/formats/anvil_world/dimension.py,sha256=Ft38XWSjJ7mRjHqF-XjEIR7uJFTB_oBaWQIPNaMrsgQ,6069
83
- amulet/level/formats/anvil_world/format.py,sha256=FYcBhiKw_kRb5yKLtFkTD-kqlYDsZTXN72snBgjmstI,27502
84
- amulet/level/formats/anvil_world/region.py,sha256=-_Ru3na9SJsUWQhzRGOb1uTLoIbg2mdpVUNIa2-TM14,14095
83
+ amulet/level/formats/anvil_world/format.py,sha256=wBP2yesGNwNL5Xl-WmYWoWV2aMJTL6Vs2ky13EzCzro,27515
84
+ amulet/level/formats/anvil_world/region.py,sha256=KzwvmQHbxYMQdps43Iwy6ruOufQst4GmyF2P3GLzuHc,15995
85
85
  amulet/level/formats/anvil_world/data_pack/__init__.py,sha256=L-He67mqDNWp0boI1VDyIz92BfBZqSKLnBcR0bYxQUA,79
86
86
  amulet/level/formats/anvil_world/data_pack/data_pack.py,sha256=N7WwzdQuqmIsjInIqhk-I0UGV67wCFc_ysQMYh0UXYU,6161
87
87
  amulet/level/formats/anvil_world/data_pack/data_pack_manager.py,sha256=1cJwn4hKT6NFoolQrx_vTeXDwWIMcENAjBw5uZHz2SA,2250
88
88
  amulet/level/formats/construction/__init__.py,sha256=HLCN4IvfSSQHAQdmZqXBpRKXi-fzjY1SvuxiSm7_4-A,90
89
- amulet/level/formats/construction/format_wrapper.py,sha256=V_2vvUOMQc-k-3mVKIJ8-UUb_HVunQhOERNexfOc0wY,18745
89
+ amulet/level/formats/construction/format_wrapper.py,sha256=HDJ6o6rlyNZSFeXmUhDkIZ8gBR5VeFPHW3reF_wDT1o,18747
90
90
  amulet/level/formats/construction/interface.py,sha256=Nd7MqTebOZY1VpDtE-ctEoQcK7-CyaxWqODVbclpTHU,4951
91
91
  amulet/level/formats/construction/section.py,sha256=_LdEQTLpaWnFhFCsmrzEFKRvXl7kKGV7dR225t1WpAc,1672
92
92
  amulet/level/formats/construction/util.py,sha256=dBBITNfxUocxxzVnUpRUetr0KuLtMVGjk0-o6iAUKBs,4930
93
93
  amulet/level/formats/leveldb_world/__init__.py,sha256=dXo6jIok-_suB3KSrhb5NZS7CicGQj-HCLiGpD76QDY,58
94
94
  amulet/level/formats/leveldb_world/chunk.py,sha256=iNMwNs09Kyj9fUo3dFZxdtLyW_uh11aXgDUqe_MKoQo,1202
95
- amulet/level/formats/leveldb_world/dimension.py,sha256=MDnPlQd5LYEJyd9Z9B_-bsbfCkOqQsoTZfEfrxVwupA,14726
95
+ amulet/level/formats/leveldb_world/dimension.py,sha256=LdrhL6xO9Kk3xMsYMzo3dWcVgTldzymlItC-YlQ6HHU,14728
96
96
  amulet/level/formats/leveldb_world/format.py,sha256=PsnpNE778q83wKw_6bbH06V9Q1avIpyh3U8pj0iTMlw,23401
97
97
  amulet/level/formats/leveldb_world/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  amulet/level/formats/leveldb_world/interface/chunk/__init__.py,sha256=S606IgGmRqdQfv223yciHil3qqna8r5DiW8gsrNHyf0,1180
99
- amulet/level/formats/leveldb_world/interface/chunk/base_leveldb_interface.py,sha256=3SvaZX_2Umi3ibfD9zVo6pn6vnnJ34NQOJ51oDB8JRs,32470
99
+ amulet/level/formats/leveldb_world/interface/chunk/base_leveldb_interface.py,sha256=jvbFITofMtWpU_g_NV_nkEcr0aZ28vibjAkFCHDSQAQ,32474
100
100
  amulet/level/formats/leveldb_world/interface/chunk/generate_interface.py,sha256=izp5uJPzNoSM9k-EkbqN6RMsmUSTEyhuqxF7S3v-Szw,738
101
101
  amulet/level/formats/leveldb_world/interface/chunk/leveldb_0.py,sha256=48MN18o9MLY2DBI3fOwb6etSc30eBLTVXfiXFVigygs,879
102
102
  amulet/level/formats/leveldb_world/interface/chunk/leveldb_1.py,sha256=9xgQfC-nF4GqV0pW1tFEXGgu66Jhbmyu0X0xARSUsUo,183
@@ -142,7 +142,7 @@ amulet/level/formats/leveldb_world/interface/chunk/leveldb_9.py,sha256=i4hAlxvCm
142
142
  amulet/level/formats/leveldb_world/interface/chunk/leveldb_chunk_versions.py,sha256=ovG24Ci6PNSlNnQqh-Qh9c8v_3ulFzDJG5khYbWG9bA,3656
143
143
  amulet/level/formats/mcstructure/__init__.py,sha256=cRwoW6W93uFFmGHJgYOr8w5Z05b2zYWsMKx-qf_Cjao,88
144
144
  amulet/level/formats/mcstructure/chunk.py,sha256=rqdfWsNt8CtCBzxgs_8Gkjbc1WUHrab-pQ37_F5DPWU,1378
145
- amulet/level/formats/mcstructure/format_wrapper.py,sha256=OTC69aK6sJKUE4s5c51jFYxywazHOA2moYcmsyLmEBQ,15060
145
+ amulet/level/formats/mcstructure/format_wrapper.py,sha256=2DazC0Rrl9QpensHj0f1UrVq2wXP05itY7D7RCvIrF0,14833
146
146
  amulet/level/formats/mcstructure/interface.py,sha256=b9Y3e8_eoDK0rTbLPuinYxkao5ydJ_uLPA3Re484K1Q,6467
147
147
  amulet/level/formats/schematic/__init__.py,sha256=BwYlVsVEm8zJrMvBLx4txutBMDl4uMxYjVIJBDH278g,84
148
148
  amulet/level/formats/schematic/chunk.py,sha256=0R2voXU3EaYod8S63caRgJvwKsTx3GHw6RlurEK7xj8,1566
@@ -151,7 +151,7 @@ amulet/level/formats/schematic/format_wrapper.py,sha256=qfhk3B8GsdubRDkBkCL9_mqJ
151
151
  amulet/level/formats/schematic/interface.py,sha256=SrdUezAbJfVIPf4riDm29L-xkvT4nuc3oZfLzrg6ycM,5265
152
152
  amulet/level/formats/sponge_schem/__init__.py,sha256=LbmzUuNjMTtT1966euIBhLUzW_SrTdmisOBPQNmkfH0,102
153
153
  amulet/level/formats/sponge_schem/chunk.py,sha256=PyX4GO1KUwlmaRnVdybD0NgRHW1612r2muWcwCV2rD8,1715
154
- amulet/level/formats/sponge_schem/format_wrapper.py,sha256=aka1IjbcuTWz6oO6tgj2KDpRK2yYfgAN3FLAteAkAvg,17046
154
+ amulet/level/formats/sponge_schem/format_wrapper.py,sha256=BcDO-UProUOVahRxCJJIsfImNaXqKOwUh8_V1fTTBCw,17016
155
155
  amulet/level/formats/sponge_schem/interface.py,sha256=5VipfVc8AqcP6mk8xbf63Q9fNE4-a3fXHK8da2Mdog8,4508
156
156
  amulet/level/formats/sponge_schem/varint/__init__.py,sha256=IaKmhRtL0rfj7E0ZJXSXiW20qADQ3e5WyrQqYm57TtE,81
157
157
  amulet/level/formats/sponge_schem/varint/varint.py,sha256=2XZ7IocfYqeCYalCr7WHb5OE4PnmGq3dV4oThg9Kb3I,2361
@@ -174,7 +174,7 @@ amulet/level/interfaces/chunk/anvil/anvil_2529.py,sha256=UTtQkxcM3jUdSWpy02gehEh
174
174
  amulet/level/interfaces/chunk/anvil/anvil_2681.py,sha256=w9lz9014E3yNFdsLUFvF4UP1IE_OzdwFp8lZ0Zl5tCg,2319
175
175
  amulet/level/interfaces/chunk/anvil/anvil_2709.py,sha256=qRvOb67bjyh-HcSEUiqlf1YKMqPfZjeW98Aid92YQy8,417
176
176
  amulet/level/interfaces/chunk/anvil/anvil_2844.py,sha256=0jqoRhw5kRgDUfmm6dF18lxpIsDvm0eSL2rckVFhCCY,10216
177
- amulet/level/interfaces/chunk/anvil/anvil_3463.py,sha256=vin45VuAiRsLhM03n6Sl527-O28fiiwIiTBwE3gklx4,422
177
+ amulet/level/interfaces/chunk/anvil/anvil_3463.py,sha256=DXduuopYNspAjxmHuQkPzeJo7_ZGPQkV6IxEWktJLEM,423
178
178
  amulet/level/interfaces/chunk/anvil/anvil_na.py,sha256=9E9Jd9sQQqG_osfYmIg50hbMpZ0c9Dhi1N1ZDurC2VI,22007
179
179
  amulet/level/interfaces/chunk/anvil/base_anvil_interface.py,sha256=fG3nEkRxY9O-yvlBPFJW1abTb8Vw6Lhh7rjMJf7c1SA,11979
180
180
  amulet/level/translators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -201,8 +201,8 @@ amulet/utils/generator.py,sha256=2pKToghl8irYozX5hBJYtjTQVzhljznPCi42hQKRGDQ,364
201
201
  amulet/utils/matrix.py,sha256=KSqluO0H6oHUfe0pU4Esv67pOmHFurK2BDOrZAeNxg8,7665
202
202
  amulet/utils/numpy_helpers.py,sha256=fM0rjZxbUqoTMTrFooZEVVhHfsqv0j_7KPGsjVq4ReM,1232
203
203
  amulet/utils/world_utils.py,sha256=xb6JPrrbwDF0_y4ZYjTJ1ieydL3COzzLosTgcxDDyRc,12559
204
- amulet_core-1.9.20.dist-info/METADATA,sha256=SYeHecDnCp-awuJ5JkzMoHmIWRQMVm5RhR81LTzCfo0,4262
205
- amulet_core-1.9.20.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
206
- amulet_core-1.9.20.dist-info/entry_points.txt,sha256=53zFNThTPzI8f9ertsyU2DoUpxdWU8rjOA_Cu4YH5Vk,63
207
- amulet_core-1.9.20.dist-info/top_level.txt,sha256=3ZqHzNDiIb9kV8TwSeeXxK_9haSrsu631Qe4ndDo0rc,7
208
- amulet_core-1.9.20.dist-info/RECORD,,
204
+ amulet_core-1.9.22.dist-info/METADATA,sha256=sGrR7pkSs401NZnBcdzVggpTqxkKLta95d0O-7ojTjM,4287
205
+ amulet_core-1.9.22.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
206
+ amulet_core-1.9.22.dist-info/entry_points.txt,sha256=53zFNThTPzI8f9ertsyU2DoUpxdWU8rjOA_Cu4YH5Vk,63
207
+ amulet_core-1.9.22.dist-info/top_level.txt,sha256=3ZqHzNDiIb9kV8TwSeeXxK_9haSrsu631Qe4ndDo0rc,7
208
+ amulet_core-1.9.22.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5