amulet-core 2.0a5__cp312-cp312-win_amd64.whl → 2.0a7__cp312-cp312-win_amd64.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__.cp312-win_amd64.pyd +0 -0
- amulet/__init__.py.cpp +43 -0
- amulet/__init__.pyi +0 -2
- amulet/_init.py +0 -2
- amulet/_version.py +3 -3
- amulet/biome.py.cpp +122 -0
- amulet/biome.pyi +0 -2
- amulet/block.py.cpp +377 -0
- amulet/block.pyi +0 -2
- amulet/block_entity.py.cpp +115 -0
- amulet/block_entity.pyi +0 -2
- amulet/chunk.py.cpp +80 -0
- amulet/chunk.pyi +0 -2
- amulet/chunk_components/biome_3d_component.cpp +5 -0
- amulet/chunk_components/biome_3d_component.hpp +79 -0
- amulet/chunk_components/block_component.cpp +41 -0
- amulet/chunk_components/block_component.hpp +88 -0
- amulet/chunk_components/block_entity_component.cpp +5 -0
- amulet/chunk_components/block_entity_component.hpp +147 -0
- amulet/chunk_components/section_array_map.cpp +129 -0
- amulet/chunk_components/section_array_map.hpp +147 -0
- amulet/chunk_components.pyi +20 -18
- amulet/collections/eq.py.hpp +37 -0
- amulet/collections/hash.py.hpp +27 -0
- amulet/collections/holder.py.hpp +37 -0
- amulet/collections/iterator.py.hpp +80 -0
- amulet/collections/mapping.py.hpp +199 -0
- amulet/collections/mutable_mapping.py.hpp +226 -0
- amulet/collections/sequence.py.hpp +163 -0
- amulet/collections.pyi +8 -5
- amulet/entity.py +22 -20
- amulet/game/translate/_functions/_code_functions/_text.py +2 -2
- amulet/game/translate/_functions/abc.py +10 -3
- amulet/img/__init__.py +10 -0
- amulet/img/missing_no.png +0 -0
- amulet/img/missing_pack.png +0 -0
- amulet/img/missing_world.png +0 -0
- amulet/io/binary_reader.hpp +45 -0
- amulet/io/binary_writer.hpp +30 -0
- amulet/level/__init__.pyi +2 -6
- amulet/level/abc/_level/_creatable_level.py +1 -2
- amulet/level/abc/_level/_level.py +1 -5
- amulet/level/java/__init__.pyi +0 -5
- amulet/level/java/_raw/__init__.pyi +0 -4
- amulet/level/java/_raw/java_chunk_decode.cpp +531 -0
- amulet/level/java/_raw/java_chunk_decode.hpp +23 -0
- amulet/level/java/_raw/java_chunk_encode.cpp +25 -0
- amulet/level/java/_raw/java_chunk_encode.hpp +23 -0
- amulet/level/java/chunk_components/data_version_component.cpp +32 -0
- amulet/level/java/chunk_components/data_version_component.hpp +31 -0
- amulet/level/java/chunk_components/java_raw_chunk_component.cpp +56 -0
- amulet/level/java/chunk_components/java_raw_chunk_component.hpp +45 -0
- amulet/level/java/java_chunk.cpp +170 -0
- amulet/level/java/java_chunk.hpp +141 -0
- amulet/level/java/long_array.hpp +175 -0
- amulet/level/java/long_array.pyi +2 -1
- amulet/mesh/block/__init__.py +1 -0
- amulet/mesh/block/block_mesh.py +369 -0
- amulet/mesh/block/cube.py +149 -0
- amulet/mesh/block/missing_block.py +20 -0
- amulet/mesh/util.py +17 -0
- amulet/palette/biome_palette.hpp +85 -0
- amulet/palette/block_palette.cpp +32 -0
- amulet/palette/block_palette.hpp +93 -0
- amulet/player.py +4 -6
- amulet/pybind11/collections.hpp +118 -0
- amulet/pybind11/numpy.hpp +26 -0
- amulet/pybind11/py_module.hpp +34 -0
- amulet/pybind11/type_hints.hpp +51 -0
- amulet/pybind11/types.hpp +25 -0
- amulet/pybind11/typing.hpp +7 -0
- amulet/resource_pack/__init__.py +62 -0
- amulet/resource_pack/abc/__init__.py +2 -0
- amulet/resource_pack/abc/resource_pack.py +38 -0
- amulet/resource_pack/abc/resource_pack_manager.py +87 -0
- amulet/resource_pack/bedrock/__init__.py +2 -0
- amulet/resource_pack/bedrock/bedrock_vanilla_fix/pack_icon.png +0 -0
- amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_carried.png +0 -0
- amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_side_carried.png +0 -0
- amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/water.png +0 -0
- amulet/resource_pack/bedrock/blockshapes/__init__.py +31 -0
- amulet/resource_pack/bedrock/blockshapes/air.py +35 -0
- amulet/resource_pack/bedrock/blockshapes/base_blockshape.py +29 -0
- amulet/resource_pack/bedrock/blockshapes/bubble_column.py +29 -0
- amulet/resource_pack/bedrock/blockshapes/cake.py +46 -0
- amulet/resource_pack/bedrock/blockshapes/chest.py +54 -0
- amulet/resource_pack/bedrock/blockshapes/comparator.py +51 -0
- amulet/resource_pack/bedrock/blockshapes/cross_texture.py +186 -0
- amulet/resource_pack/bedrock/blockshapes/cross_texture0.py +17 -0
- amulet/resource_pack/bedrock/blockshapes/cross_texture_green.py +16 -0
- amulet/resource_pack/bedrock/blockshapes/cube.py +38 -0
- amulet/resource_pack/bedrock/blockshapes/default.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door.py +38 -0
- amulet/resource_pack/bedrock/blockshapes/door1.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door2.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door3.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door4.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door5.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/door6.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/double_plant.py +40 -0
- amulet/resource_pack/bedrock/blockshapes/enchanting_table.py +22 -0
- amulet/resource_pack/bedrock/blockshapes/farmland.py +22 -0
- amulet/resource_pack/bedrock/blockshapes/fence.py +22 -0
- amulet/resource_pack/bedrock/blockshapes/flat.py +55 -0
- amulet/resource_pack/bedrock/blockshapes/flat_wall.py +55 -0
- amulet/resource_pack/bedrock/blockshapes/furnace.py +44 -0
- amulet/resource_pack/bedrock/blockshapes/furnace_lit.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/green_cube.py +39 -0
- amulet/resource_pack/bedrock/blockshapes/ladder.py +36 -0
- amulet/resource_pack/bedrock/blockshapes/lilypad.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/partial_block.py +57 -0
- amulet/resource_pack/bedrock/blockshapes/piston.py +44 -0
- amulet/resource_pack/bedrock/blockshapes/piston_arm.py +72 -0
- amulet/resource_pack/bedrock/blockshapes/portal_frame.py +22 -0
- amulet/resource_pack/bedrock/blockshapes/pressure_plate.py +29 -0
- amulet/resource_pack/bedrock/blockshapes/pumpkin.py +36 -0
- amulet/resource_pack/bedrock/blockshapes/pumpkin_carved.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/pumpkin_lit.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/red_dust.py +14 -0
- amulet/resource_pack/bedrock/blockshapes/repeater.py +53 -0
- amulet/resource_pack/bedrock/blockshapes/slab.py +33 -0
- amulet/resource_pack/bedrock/blockshapes/slab_double.py +15 -0
- amulet/resource_pack/bedrock/blockshapes/tree.py +41 -0
- amulet/resource_pack/bedrock/blockshapes/turtle_egg.py +15 -0
- amulet/resource_pack/bedrock/blockshapes/vine.py +52 -0
- amulet/resource_pack/bedrock/blockshapes/wall.py +22 -0
- amulet/resource_pack/bedrock/blockshapes/water.py +38 -0
- amulet/resource_pack/bedrock/download_resources.py +147 -0
- amulet/resource_pack/bedrock/resource_pack.py +40 -0
- amulet/resource_pack/bedrock/resource_pack_manager.py +361 -0
- amulet/resource_pack/bedrock/sort_blockshapes.py +15 -0
- amulet/resource_pack/java/__init__.py +2 -0
- amulet/resource_pack/java/download_resources.py +212 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
- amulet/resource_pack/java/resource_pack.py +44 -0
- amulet/resource_pack/java/resource_pack_manager.py +551 -0
- amulet/resource_pack/unknown_resource_pack.py +10 -0
- amulet/utils/__init__.pyi +0 -5
- amulet/utils/call_spec/_call_spec.py +2 -7
- amulet/utils/comment_json.py +188 -0
- amulet/utils/matrix.py +3 -3
- amulet/utils/numpy.hpp +36 -0
- amulet/utils/numpy_helpers.py +2 -2
- amulet/utils/world_utils.py +2 -2
- amulet/version.py.cpp +281 -0
- amulet/version.pyi +0 -8
- {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/METADATA +3 -3
- amulet_core-2.0a7.dist-info/RECORD +295 -0
- amulet/chunk_/components/biome.py +0 -155
- amulet/chunk_/components/block_entity.py +0 -117
- amulet/chunk_/components/entity.py +0 -64
- amulet/chunk_/components/height_2d.py +0 -16
- amulet/level/bedrock/__init__.py +0 -2
- amulet/level/bedrock/_chunk_handle.py +0 -19
- amulet/level/bedrock/_dimension.py +0 -22
- amulet/level/bedrock/_level.py +0 -187
- amulet/level/bedrock/_raw/__init__.py +0 -5
- amulet/level/bedrock/_raw/_actor_counter.py +0 -53
- amulet/level/bedrock/_raw/_chunk.py +0 -54
- amulet/level/bedrock/_raw/_chunk_decode.py +0 -668
- amulet/level/bedrock/_raw/_chunk_encode.py +0 -602
- amulet/level/bedrock/_raw/_constant.py +0 -9
- amulet/level/bedrock/_raw/_dimension.py +0 -343
- amulet/level/bedrock/_raw/_level.py +0 -463
- amulet/level/bedrock/_raw/_level_dat.py +0 -90
- amulet/level/bedrock/_raw/_typing.py +0 -6
- amulet/level/bedrock/_raw/leveldb_chunk_versions.py +0 -83
- amulet/level/bedrock/chunk/__init__.py +0 -1
- amulet/level/bedrock/chunk/_chunk.py +0 -126
- amulet/level/bedrock/chunk/components/chunk_version.py +0 -12
- amulet/level/bedrock/chunk/components/finalised_state.py +0 -13
- amulet/level/bedrock/chunk/components/raw_chunk.py +0 -15
- amulet/level/construction/__init__.py +0 -0
- amulet/level/java/_chunk_handle.pyi +0 -15
- amulet/level/java/_dimension.pyi +0 -13
- amulet/level/java/_level.pyi +0 -120
- amulet/level/java/_raw/_chunk_decode.py +0 -561
- amulet/level/java/_raw/_chunk_encode.py +0 -463
- amulet/level/java/_raw/_constant.pyi +0 -20
- amulet/level/java/_raw/_data_pack/__init__.pyi +0 -8
- amulet/level/java/_raw/_data_pack/data_pack.pyi +0 -197
- amulet/level/java/_raw/_data_pack/data_pack_manager.pyi +0 -75
- amulet/level/java/_raw/_dimension.pyi +0 -72
- amulet/level/java/_raw/_level.pyi +0 -238
- amulet/level/java/_raw/_typing.pyi +0 -5
- amulet/level/java/anvil/__init__.pyi +0 -11
- amulet/level/java/anvil/_dimension.pyi +0 -109
- amulet/level/java/anvil/_region.pyi +0 -197
- amulet/level/java/anvil/_sector_manager.pyi +0 -142
- amulet/level/java_forge/__init__.py +0 -0
- amulet/level/mcstructure/__init__.py +0 -0
- amulet/level/nbt/__init__.py +0 -0
- amulet/level/schematic/__init__.py +0 -0
- amulet/level/sponge_schematic/__init__.py +0 -0
- amulet/utils/call_spec/__init__.pyi +0 -53
- amulet/utils/call_spec/_call_spec.pyi +0 -272
- amulet/utils/matrix.pyi +0 -177
- amulet/utils/shareable_lock.pyi +0 -190
- amulet/utils/signal/__init__.pyi +0 -25
- amulet/utils/signal/_signal.pyi +0 -84
- amulet/utils/task_manager.pyi +0 -168
- amulet/utils/typing.py +0 -4
- amulet/utils/typing.pyi +0 -6
- amulet/utils/weakref.pyi +0 -50
- amulet/utils/world_utils.pyi +0 -109
- amulet_core-2.0a5.dist-info/RECORD +0 -210
- /amulet/{level/bedrock/chunk/components → mesh}/__init__.py +0 -0
- {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/WHEEL +0 -0
- {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/entry_points.txt +0 -0
- {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/top_level.txt +0 -0
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# import numpy
|
|
2
|
-
# from numpy.typing import ArrayLike
|
|
3
|
-
# from .abc import ChunkComponent
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# class Height2DComponent(ChunkComponent[numpy.ndarray, ArrayLike]):
|
|
7
|
-
# storage_key = b"h2d"
|
|
8
|
-
#
|
|
9
|
-
# @staticmethod
|
|
10
|
-
# def fix_set_data(old_obj: numpy.ndarray, new_obj: ArrayLike) -> numpy.ndarray:
|
|
11
|
-
# new_obj = numpy.asarray(new_obj, numpy.int64)
|
|
12
|
-
# if not isinstance(new_obj, numpy.ndarray):
|
|
13
|
-
# raise TypeError
|
|
14
|
-
# if new_obj.shape != old_obj.shape or new_obj.dtype != numpy.int64:
|
|
15
|
-
# raise ValueError
|
|
16
|
-
# return new_obj
|
amulet/level/bedrock/__init__.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
|
-
|
|
4
|
-
from amulet.level.abc import ChunkHandle
|
|
5
|
-
from ..abc._chunk_handle import ChunkT
|
|
6
|
-
from .chunk import BedrockChunk
|
|
7
|
-
|
|
8
|
-
if TYPE_CHECKING:
|
|
9
|
-
from ._level import BedrockLevel
|
|
10
|
-
from ._raw import BedrockRawDimension
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class BedrockChunkHandle(
|
|
14
|
-
ChunkHandle["BedrockLevel", "BedrockRawDimension", BedrockChunk]
|
|
15
|
-
):
|
|
16
|
-
@staticmethod
|
|
17
|
-
def _validate_chunk(chunk: ChunkT) -> None:
|
|
18
|
-
if not isinstance(chunk, BedrockChunk):
|
|
19
|
-
raise TypeError
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING
|
|
2
|
-
|
|
3
|
-
from amulet.level.abc import Dimension
|
|
4
|
-
from ._chunk_handle import BedrockChunkHandle
|
|
5
|
-
|
|
6
|
-
if TYPE_CHECKING:
|
|
7
|
-
from ._level import BedrockLevel
|
|
8
|
-
from ._raw import BedrockRawDimension
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class BedrockDimension(
|
|
12
|
-
Dimension["BedrockLevel", "BedrockRawDimension", BedrockChunkHandle]
|
|
13
|
-
):
|
|
14
|
-
def _create_chunk_handle(self, cx: int, cz: int) -> BedrockChunkHandle:
|
|
15
|
-
return BedrockChunkHandle(
|
|
16
|
-
self._l_ref,
|
|
17
|
-
self._chunk_history,
|
|
18
|
-
self._chunk_data_history,
|
|
19
|
-
self.dimension_id,
|
|
20
|
-
cx,
|
|
21
|
-
cz,
|
|
22
|
-
)
|
amulet/level/bedrock/_level.py
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any, Union, Type, Callable
|
|
4
|
-
import os
|
|
5
|
-
|
|
6
|
-
from PIL import Image
|
|
7
|
-
|
|
8
|
-
from amulet.version import VersionNumber, PlatformType
|
|
9
|
-
from amulet.data_types import DimensionId
|
|
10
|
-
from amulet.level import register_level_class
|
|
11
|
-
from amulet.level.abc import (
|
|
12
|
-
LevelOpenData,
|
|
13
|
-
DiskLevel,
|
|
14
|
-
CreatableLevel,
|
|
15
|
-
LoadableLevel,
|
|
16
|
-
CompactableLevel,
|
|
17
|
-
PlayerStorage,
|
|
18
|
-
)
|
|
19
|
-
from amulet.utils.format_utils import check_all_exist
|
|
20
|
-
from amulet.utils.call_spec import (
|
|
21
|
-
StringArg,
|
|
22
|
-
IntArg,
|
|
23
|
-
CallableArg,
|
|
24
|
-
BoolArg,
|
|
25
|
-
DirectoryPathArg,
|
|
26
|
-
PositionalArgs,
|
|
27
|
-
method_spec,
|
|
28
|
-
)
|
|
29
|
-
from amulet.utils.weakref import DetachableWeakRef
|
|
30
|
-
|
|
31
|
-
from ._raw import BedrockRawLevel, InternalDimension, BedrockCreateArgsV1
|
|
32
|
-
from ._dimension import BedrockDimension
|
|
33
|
-
from ...chunk import Chunk
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class BedrockLevelOpenData(LevelOpenData):
|
|
37
|
-
back_reference: Callable[[], BedrockLevel | None]
|
|
38
|
-
detach_back_reference: Callable[[], None]
|
|
39
|
-
dimensions: dict[Union[DimensionId, InternalDimension], BedrockDimension]
|
|
40
|
-
|
|
41
|
-
def __init__(self, level: BedrockLevel) -> None:
|
|
42
|
-
super().__init__()
|
|
43
|
-
self.back_reference, self.detach_back_reference = DetachableWeakRef.new(level)
|
|
44
|
-
self.dimensions = {}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class BedrockLevel(
|
|
48
|
-
DiskLevel[BedrockLevelOpenData, BedrockDimension, BedrockRawLevel],
|
|
49
|
-
CreatableLevel,
|
|
50
|
-
LoadableLevel,
|
|
51
|
-
CompactableLevel,
|
|
52
|
-
):
|
|
53
|
-
def save(self) -> None:
|
|
54
|
-
pass
|
|
55
|
-
|
|
56
|
-
@property
|
|
57
|
-
def native_chunk_class(self) -> Type[Chunk]:
|
|
58
|
-
raise NotImplementedError
|
|
59
|
-
|
|
60
|
-
_raw_level: BedrockRawLevel
|
|
61
|
-
|
|
62
|
-
__slots__ = ("_raw_level",)
|
|
63
|
-
|
|
64
|
-
def __init__(self, _ikwiad: bool = False) -> None:
|
|
65
|
-
if not _ikwiad:
|
|
66
|
-
raise RuntimeError(
|
|
67
|
-
"BedrockLevel cannot be directly initialised. Use create or load classmethod."
|
|
68
|
-
)
|
|
69
|
-
super().__init__()
|
|
70
|
-
|
|
71
|
-
def __init(self, raw: BedrockRawLevel) -> None:
|
|
72
|
-
self._raw_level = raw
|
|
73
|
-
self._raw_level.opened.connect(self.open)
|
|
74
|
-
self._raw_level.closed.connect(self.close)
|
|
75
|
-
|
|
76
|
-
@classmethod
|
|
77
|
-
@method_spec(
|
|
78
|
-
CallableArg(
|
|
79
|
-
BedrockCreateArgsV1,
|
|
80
|
-
BoolArg(True),
|
|
81
|
-
DirectoryPathArg(),
|
|
82
|
-
CallableArg(
|
|
83
|
-
VersionNumber,
|
|
84
|
-
PositionalArgs(IntArg(min_value=0), (IntArg(1), IntArg(20))),
|
|
85
|
-
),
|
|
86
|
-
StringArg("New World"),
|
|
87
|
-
)
|
|
88
|
-
)
|
|
89
|
-
def create(cls, args: BedrockCreateArgsV1) -> BedrockLevel:
|
|
90
|
-
raw = BedrockRawLevel.create(args)
|
|
91
|
-
self = cls(True)
|
|
92
|
-
self.__init(raw)
|
|
93
|
-
return self
|
|
94
|
-
|
|
95
|
-
@staticmethod
|
|
96
|
-
def can_load(token: Any) -> bool:
|
|
97
|
-
return (
|
|
98
|
-
isinstance(token, str)
|
|
99
|
-
and os.path.isdir(token)
|
|
100
|
-
and check_all_exist(token, "db", "level.dat", "levelname.txt")
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
@classmethod
|
|
104
|
-
def load(cls, path: str) -> BedrockLevel:
|
|
105
|
-
"""Create a new instance from the level at the given directory."""
|
|
106
|
-
raw = BedrockRawLevel.load(path)
|
|
107
|
-
self = cls(True)
|
|
108
|
-
self.__init(raw)
|
|
109
|
-
return self
|
|
110
|
-
|
|
111
|
-
def reload(self) -> None:
|
|
112
|
-
"""
|
|
113
|
-
Reload the level metadata inplace.
|
|
114
|
-
The level must be closed when this is called.
|
|
115
|
-
"""
|
|
116
|
-
self.raw.reload()
|
|
117
|
-
|
|
118
|
-
def _open(self) -> None:
|
|
119
|
-
self.raw.open()
|
|
120
|
-
self._open_data = BedrockLevelOpenData(self)
|
|
121
|
-
|
|
122
|
-
def _close(self) -> None:
|
|
123
|
-
self._o.detach_back_reference()
|
|
124
|
-
self._open_data = None
|
|
125
|
-
self.raw.close()
|
|
126
|
-
|
|
127
|
-
@property
|
|
128
|
-
def path(self) -> str:
|
|
129
|
-
return self.raw.path
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def level_name(self) -> str:
|
|
133
|
-
try:
|
|
134
|
-
level_name_tag = self.raw.level_dat.compound.get_string("LevelName")
|
|
135
|
-
assert level_name_tag is not None
|
|
136
|
-
return level_name_tag.py_str
|
|
137
|
-
except Exception:
|
|
138
|
-
return "Unknown level name"
|
|
139
|
-
|
|
140
|
-
@property
|
|
141
|
-
def modified_time(self) -> float:
|
|
142
|
-
return self.raw.modified_time
|
|
143
|
-
|
|
144
|
-
@property
|
|
145
|
-
def thumbnail(self) -> Image.Image:
|
|
146
|
-
try:
|
|
147
|
-
return Image.open(os.path.join(self.path, "world_icon.jpeg"))
|
|
148
|
-
except Exception:
|
|
149
|
-
return super().thumbnail
|
|
150
|
-
|
|
151
|
-
@property
|
|
152
|
-
def platform(self) -> PlatformType:
|
|
153
|
-
return "bedrock"
|
|
154
|
-
|
|
155
|
-
@property
|
|
156
|
-
def max_game_version(self) -> VersionNumber:
|
|
157
|
-
return self.raw.version
|
|
158
|
-
|
|
159
|
-
def dimension_ids(self) -> frozenset[DimensionId]:
|
|
160
|
-
return self.raw.dimension_ids()
|
|
161
|
-
|
|
162
|
-
def get_dimension(
|
|
163
|
-
self, dimension_id: Union[DimensionId, InternalDimension]
|
|
164
|
-
) -> BedrockDimension:
|
|
165
|
-
dimensions = self._o.dimensions
|
|
166
|
-
if dimension_id not in dimensions:
|
|
167
|
-
raw_dimension = self.raw.get_dimension(dimension_id)
|
|
168
|
-
public_dimension_id = raw_dimension.dimension_id
|
|
169
|
-
internal_dimension_id = raw_dimension.internal_dimension_id
|
|
170
|
-
dimensions[internal_dimension_id] = dimensions[public_dimension_id] = (
|
|
171
|
-
BedrockDimension(self._o.back_reference, public_dimension_id)
|
|
172
|
-
)
|
|
173
|
-
return dimensions[dimension_id]
|
|
174
|
-
|
|
175
|
-
@property
|
|
176
|
-
def raw(self) -> BedrockRawLevel:
|
|
177
|
-
return self._raw_level
|
|
178
|
-
|
|
179
|
-
@property
|
|
180
|
-
def player(self) -> PlayerStorage:
|
|
181
|
-
raise NotImplementedError
|
|
182
|
-
|
|
183
|
-
def compact(self) -> None:
|
|
184
|
-
self.raw.level_db.compact()
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
register_level_class(BedrockLevel)
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
4
|
-
from threading import RLock
|
|
5
|
-
|
|
6
|
-
from amulet_nbt import LongTag
|
|
7
|
-
|
|
8
|
-
if TYPE_CHECKING:
|
|
9
|
-
from ._level import BedrockRawLevel
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class ActorCounter:
|
|
13
|
-
_lock: RLock
|
|
14
|
-
_session: int
|
|
15
|
-
_count: int
|
|
16
|
-
|
|
17
|
-
def __init__(self) -> None:
|
|
18
|
-
self._lock = RLock()
|
|
19
|
-
self._session = -1
|
|
20
|
-
self._count = 0
|
|
21
|
-
|
|
22
|
-
def init(self, raw: BedrockRawLevel) -> None:
|
|
23
|
-
"""Initialise the session from the level.dat file.
|
|
24
|
-
This must be run after the level has been opened so that the level.dat can be written.
|
|
25
|
-
"""
|
|
26
|
-
level_dat = raw.level_dat
|
|
27
|
-
session = level_dat.compound.get_long(
|
|
28
|
-
"worldStartCount", LongTag(0xFFFFFFFF)
|
|
29
|
-
).py_int
|
|
30
|
-
# for some reason this is a signed int stored in a signed long. Manually apply the sign correctly
|
|
31
|
-
session -= (session & 0x80000000) << 1
|
|
32
|
-
|
|
33
|
-
# create the counter object and set the session
|
|
34
|
-
self._session = session
|
|
35
|
-
|
|
36
|
-
# increment and write back so there are no conflicts
|
|
37
|
-
session -= 1
|
|
38
|
-
if session < 0:
|
|
39
|
-
session += 0x100000000
|
|
40
|
-
level_dat.compound["worldStartCount"] = LongTag(session)
|
|
41
|
-
raw.level_dat = level_dat
|
|
42
|
-
|
|
43
|
-
def next(self) -> tuple[int, int]:
|
|
44
|
-
"""
|
|
45
|
-
Get the next unique session id and actor counter.
|
|
46
|
-
Session id is usually negative
|
|
47
|
-
|
|
48
|
-
:return: Tuple[session id, actor id]
|
|
49
|
-
"""
|
|
50
|
-
with self._lock:
|
|
51
|
-
count = self._count
|
|
52
|
-
self._count += 1
|
|
53
|
-
return self._session, count
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
from typing import Iterable
|
|
2
|
-
from collections.abc import Mapping
|
|
3
|
-
from amulet_nbt import NamedTag
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class BedrockRawChunk:
|
|
7
|
-
_keys: frozenset[bytes]
|
|
8
|
-
_chunk_data: dict[bytes, bytes]
|
|
9
|
-
_entity_actor: list[NamedTag]
|
|
10
|
-
_unknown_actor: list[NamedTag]
|
|
11
|
-
|
|
12
|
-
def __init__(
|
|
13
|
-
self,
|
|
14
|
-
*,
|
|
15
|
-
chunk_keys: Iterable[bytes] = (),
|
|
16
|
-
chunk_data: Mapping[bytes, bytes] | Iterable[tuple[bytes, bytes]] = (),
|
|
17
|
-
entity_actor: Iterable[NamedTag] = (),
|
|
18
|
-
unknown_actor: Iterable[NamedTag] = (),
|
|
19
|
-
) -> None:
|
|
20
|
-
self._keys = frozenset(chunk_keys)
|
|
21
|
-
self._chunk_data = dict(chunk_data)
|
|
22
|
-
self._entity_actor = list(entity_actor)
|
|
23
|
-
self._unknown_actor = list(unknown_actor)
|
|
24
|
-
|
|
25
|
-
@property
|
|
26
|
-
def keys(self) -> frozenset[bytes]:
|
|
27
|
-
"""All keys that make up this chunk data."""
|
|
28
|
-
return self._keys
|
|
29
|
-
|
|
30
|
-
@property
|
|
31
|
-
def chunk_data(self) -> dict[bytes, bytes]:
|
|
32
|
-
"""
|
|
33
|
-
A dictionary mapping all chunk data keys that have the XXXXZZZZ[DDDD] prefix (without the prefix) to the data
|
|
34
|
-
stored in that key.
|
|
35
|
-
"""
|
|
36
|
-
return self._chunk_data
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
def entity_actor(self) -> list[NamedTag]:
|
|
40
|
-
"""
|
|
41
|
-
A list of entity actor data.
|
|
42
|
-
UniqueID is stripped out. internalComponents is stripped out if there is no other data.
|
|
43
|
-
"""
|
|
44
|
-
return self._entity_actor
|
|
45
|
-
|
|
46
|
-
@property
|
|
47
|
-
def unknown_actor(self) -> list[NamedTag]:
|
|
48
|
-
"""
|
|
49
|
-
A list of actor data that does not fit in the known actor types.
|
|
50
|
-
UniqueID is stripped out.
|
|
51
|
-
internalComponents.{StorageKeyComponent}.StorageKey is replaced with a blank string.
|
|
52
|
-
All keys matching this pattern will get replaced with the real storage key when saving (at least one must exist)
|
|
53
|
-
"""
|
|
54
|
-
return self._unknown_actor
|