amulet-core 2.0a6__cp311-cp311-win_amd64.whl → 2.0a7__cp311-cp311-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__.cp311-win_amd64.pyd +0 -0
- amulet/__init__.py.cpp +4 -0
- amulet/__init__.pyi +0 -2
- amulet/_init.py +0 -2
- amulet/_version.py +3 -3
- amulet/biome.pyi +0 -2
- amulet/block.pyi +0 -2
- amulet/block_entity.pyi +0 -2
- amulet/chunk.pyi +0 -2
- amulet/chunk_components.pyi +20 -18
- amulet/collections/eq.py.hpp +1 -1
- amulet/collections/mapping.py.hpp +18 -11
- amulet/collections/mutable_mapping.py.hpp +17 -6
- amulet/collections/sequence.py.hpp +5 -6
- 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/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 +2 -4
- 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/player.py +4 -6
- amulet/pybind11/collections.hpp +80 -38
- amulet/pybind11/numpy.hpp +26 -0
- amulet/pybind11/py_module.hpp +16 -51
- amulet/pybind11/type_hints.hpp +51 -0
- amulet/pybind11/types.hpp +14 -6
- 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_helpers.py +2 -2
- amulet/utils/world_utils.py +2 -2
- amulet/version.pyi +0 -8
- {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/METADATA +2 -2
- 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/pybind11/python.hpp +0 -14
- 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.0a6.dist-info/RECORD +0 -253
- /amulet/img/{missing_world_icon.png → missing_world.png} +0 -0
- /amulet/{level/bedrock/chunk/components → mesh}/__init__.py +0 -0
- {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/WHEEL +0 -0
- {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/entry_points.txt +0 -0
- {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/top_level.txt +0 -0
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
# from __future__ import annotations
|
|
2
|
-
#
|
|
3
|
-
# from typing import Union, Iterable
|
|
4
|
-
# from collections.abc import Mapping
|
|
5
|
-
#
|
|
6
|
-
# import numpy
|
|
7
|
-
# from numpy.typing import ArrayLike
|
|
8
|
-
#
|
|
9
|
-
# from amulet.version import VersionRange
|
|
10
|
-
# from amulet.biome import Biome
|
|
11
|
-
# from amulet.palette import BiomePalette
|
|
12
|
-
# from amulet.chunk.components.sub_chunk_array import SubChunkArrayContainer
|
|
13
|
-
# from amulet.utils.typed_property import TypedProperty
|
|
14
|
-
#
|
|
15
|
-
# from .abc import ChunkComponent
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# class Biome2DComponentData:
|
|
19
|
-
# _array: numpy.ndarray
|
|
20
|
-
#
|
|
21
|
-
# def __init__(
|
|
22
|
-
# self,
|
|
23
|
-
# version_range: VersionRange,
|
|
24
|
-
# array_shape: tuple[int, int],
|
|
25
|
-
# default_biome: Biome,
|
|
26
|
-
# ):
|
|
27
|
-
# if (
|
|
28
|
-
# not isinstance(array_shape, tuple)
|
|
29
|
-
# and len(array_shape) == 2
|
|
30
|
-
# and all(isinstance(s, int) for s in array_shape)
|
|
31
|
-
# ):
|
|
32
|
-
# raise TypeError
|
|
33
|
-
#
|
|
34
|
-
# self._array_shape = array_shape
|
|
35
|
-
# self._palette = BiomePalette(version_range)
|
|
36
|
-
# self._palette.biome_to_index(default_biome)
|
|
37
|
-
# self._set_biome(0)
|
|
38
|
-
#
|
|
39
|
-
# def __getstate__(self) -> tuple[tuple[int, int], BiomePalette, numpy.ndarray]:
|
|
40
|
-
# return self._array_shape, self._palette, self._array
|
|
41
|
-
#
|
|
42
|
-
# def __setstate__(
|
|
43
|
-
# self, state: tuple[tuple[int, int], BiomePalette, numpy.ndarray]
|
|
44
|
-
# ) -> None:
|
|
45
|
-
# self._array_shape, self._palette, self._array = state
|
|
46
|
-
#
|
|
47
|
-
# @property
|
|
48
|
-
# def array_shape(self) -> tuple[int, int]:
|
|
49
|
-
# return self._array_shape
|
|
50
|
-
#
|
|
51
|
-
# @TypedProperty[numpy.ndarray, Union[int, ArrayLike]]
|
|
52
|
-
# def array(self) -> numpy.ndarray:
|
|
53
|
-
# return self._array
|
|
54
|
-
#
|
|
55
|
-
# @array.setter
|
|
56
|
-
# def _set_biome(
|
|
57
|
-
# self,
|
|
58
|
-
# array: Union[int, ArrayLike],
|
|
59
|
-
# ) -> None:
|
|
60
|
-
# if isinstance(array, int):
|
|
61
|
-
# self._array = numpy.full(self._array_shape, array, dtype=numpy.uint32)
|
|
62
|
-
# else:
|
|
63
|
-
# array = numpy.asarray(array)
|
|
64
|
-
# if not isinstance(array, numpy.ndarray):
|
|
65
|
-
# raise TypeError
|
|
66
|
-
# if array.shape != self._array_shape or array.dtype != numpy.uint32:
|
|
67
|
-
# raise ValueError
|
|
68
|
-
# self._array = numpy.array(array)
|
|
69
|
-
#
|
|
70
|
-
# @property
|
|
71
|
-
# def palette(self) -> BiomePalette:
|
|
72
|
-
# return self._palette
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
# class Biome2DComponent(ChunkComponent[Biome2DComponentData, Biome2DComponentData]):
|
|
76
|
-
# storage_key = b"b2d"
|
|
77
|
-
#
|
|
78
|
-
# @staticmethod
|
|
79
|
-
# def fix_set_data(
|
|
80
|
-
# old_obj: Biome2DComponentData, new_obj: Biome2DComponentData
|
|
81
|
-
# ) -> Biome2DComponentData:
|
|
82
|
-
# if not isinstance(new_obj, Biome2DComponentData):
|
|
83
|
-
# raise TypeError
|
|
84
|
-
# assert isinstance(old_obj, Biome2DComponentData)
|
|
85
|
-
# if (
|
|
86
|
-
# old_obj.array.shape != new_obj.array.shape
|
|
87
|
-
# or old_obj.array_shape != new_obj.array_shape
|
|
88
|
-
# ):
|
|
89
|
-
# raise ValueError("New array shape does not match old array shape.")
|
|
90
|
-
# elif old_obj.palette.version_range != new_obj.palette.version_range:
|
|
91
|
-
# raise ValueError("New version range does not match old version range.")
|
|
92
|
-
# return new_obj
|
|
93
|
-
#
|
|
94
|
-
#
|
|
95
|
-
# class Biome3DComponentData:
|
|
96
|
-
# def __init__(
|
|
97
|
-
# self,
|
|
98
|
-
# version_range: VersionRange,
|
|
99
|
-
# array_shape: tuple[int, int, int],
|
|
100
|
-
# default_biome: Biome,
|
|
101
|
-
# ):
|
|
102
|
-
# self._palette = BiomePalette(version_range)
|
|
103
|
-
# self._palette.biome_to_index(default_biome)
|
|
104
|
-
# self._sections = SubChunkArrayContainer(array_shape, 0)
|
|
105
|
-
#
|
|
106
|
-
# def __getstate__(self) -> tuple[BiomePalette, SubChunkArrayContainer]:
|
|
107
|
-
# return self._palette, self._sections
|
|
108
|
-
#
|
|
109
|
-
# def __setstate__(self, state: tuple[BiomePalette, SubChunkArrayContainer]) -> None:
|
|
110
|
-
# self._palette, self._sections = state
|
|
111
|
-
#
|
|
112
|
-
# @TypedProperty[
|
|
113
|
-
# SubChunkArrayContainer,
|
|
114
|
-
# SubChunkArrayContainer
|
|
115
|
-
# | Mapping[int, numpy.ndarray]
|
|
116
|
-
# | Iterable[tuple[int, numpy.ndarray]],
|
|
117
|
-
# ]
|
|
118
|
-
# def sections(self) -> SubChunkArrayContainer:
|
|
119
|
-
# return self._sections
|
|
120
|
-
#
|
|
121
|
-
# @sections.setter
|
|
122
|
-
# def _set_biome(
|
|
123
|
-
# self,
|
|
124
|
-
# sections: (
|
|
125
|
-
# SubChunkArrayContainer
|
|
126
|
-
# | Mapping[int, numpy.ndarray]
|
|
127
|
-
# | Iterable[tuple[int, numpy.ndarray]]
|
|
128
|
-
# ),
|
|
129
|
-
# ) -> None:
|
|
130
|
-
# if sections is not self._sections:
|
|
131
|
-
# self._sections.clear()
|
|
132
|
-
# self._sections.update(sections)
|
|
133
|
-
# if isinstance(sections, SubChunkArrayContainer):
|
|
134
|
-
# self._sections.default_array = sections.default_array
|
|
135
|
-
#
|
|
136
|
-
# @property
|
|
137
|
-
# def palette(self) -> BiomePalette:
|
|
138
|
-
# return self._palette
|
|
139
|
-
#
|
|
140
|
-
#
|
|
141
|
-
# class Biome3DComponent(ChunkComponent[Biome3DComponentData, Biome3DComponentData]):
|
|
142
|
-
# storage_key = b"b3d"
|
|
143
|
-
#
|
|
144
|
-
# @staticmethod
|
|
145
|
-
# def fix_set_data(
|
|
146
|
-
# old_obj: Biome3DComponentData, new_obj: Biome3DComponentData
|
|
147
|
-
# ) -> Biome3DComponentData:
|
|
148
|
-
# if not isinstance(new_obj, Biome3DComponentData):
|
|
149
|
-
# raise TypeError
|
|
150
|
-
# assert isinstance(old_obj, Biome3DComponentData)
|
|
151
|
-
# if old_obj.sections.array_shape != new_obj.sections.array_shape:
|
|
152
|
-
# raise ValueError("New array shape does not match old array shape.")
|
|
153
|
-
# elif old_obj.palette.version_range != new_obj.palette.version_range:
|
|
154
|
-
# raise ValueError("New version range does not match old version range.")
|
|
155
|
-
# return new_obj
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# from __future__ import annotations
|
|
2
|
-
#
|
|
3
|
-
# from collections.abc import MutableMapping
|
|
4
|
-
# from typing import Iterator, Any
|
|
5
|
-
#
|
|
6
|
-
# from amulet.data_types import BlockCoordinates
|
|
7
|
-
# from amulet.block_entity import BlockEntity
|
|
8
|
-
# from amulet.version import VersionRange, VersionRangeContainer
|
|
9
|
-
#
|
|
10
|
-
# from .abc import ChunkComponent, UnloadedComponent
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
# class BlockEntityComponentData(
|
|
14
|
-
# VersionRangeContainer, MutableMapping[BlockCoordinates, BlockEntity]
|
|
15
|
-
# ):
|
|
16
|
-
# """
|
|
17
|
-
# A MutableMapping that can only store :class:`BlockEntity` instances
|
|
18
|
-
# under the absolute coordinate of the block entity ``Tuple[int, int, int]``
|
|
19
|
-
# """
|
|
20
|
-
#
|
|
21
|
-
# _block_entities: dict[BlockCoordinates, BlockEntity]
|
|
22
|
-
#
|
|
23
|
-
# def __init__(
|
|
24
|
-
# self,
|
|
25
|
-
# version_range: VersionRange,
|
|
26
|
-
# ) -> None:
|
|
27
|
-
# super().__init__(version_range)
|
|
28
|
-
# self._block_entities = {}
|
|
29
|
-
#
|
|
30
|
-
# def __getstate__(self) -> tuple[VersionRange, dict[BlockCoordinates, BlockEntity]]: # type: ignore[override]
|
|
31
|
-
# return (
|
|
32
|
-
# super().__getstate__(),
|
|
33
|
-
# self._block_entities,
|
|
34
|
-
# )
|
|
35
|
-
#
|
|
36
|
-
# def __setstate__(self, state: tuple[VersionRange, dict[BlockCoordinates, BlockEntity]]) -> None: # type: ignore[override]
|
|
37
|
-
# super().__setstate__(state[0])
|
|
38
|
-
# self._block_entities = state[1]
|
|
39
|
-
#
|
|
40
|
-
# def __setitem__(
|
|
41
|
-
# self, coordinate: BlockCoordinates, block_entity: BlockEntity
|
|
42
|
-
# ) -> None:
|
|
43
|
-
# """
|
|
44
|
-
# Set the :class:`BlockEntity` at ``coordinate``.
|
|
45
|
-
#
|
|
46
|
-
# >>> block_entities: BlockEntityComponentData
|
|
47
|
-
# >>> x = y = z = 0
|
|
48
|
-
# >>> block_entities[(x, y, z)] = block_entity
|
|
49
|
-
#
|
|
50
|
-
# :param coordinate: The coordinate to set the block entity at.
|
|
51
|
-
# :param block_entity: The block entity to set at the specified coordinate.
|
|
52
|
-
# """
|
|
53
|
-
# if (
|
|
54
|
-
# not isinstance(coordinate, tuple)
|
|
55
|
-
# and len(coordinate) == 3
|
|
56
|
-
# and all(isinstance(c, int) for c in coordinate)
|
|
57
|
-
# ):
|
|
58
|
-
# raise TypeError
|
|
59
|
-
# if not isinstance(block_entity, BlockEntity):
|
|
60
|
-
# raise TypeError
|
|
61
|
-
# if not self.version_range.contains(block_entity.platform, block_entity.version):
|
|
62
|
-
# raise ValueError(
|
|
63
|
-
# f"block entity {block_entity} is incompatible with {self.version_range}"
|
|
64
|
-
# )
|
|
65
|
-
# self._block_entities[coordinate] = block_entity
|
|
66
|
-
#
|
|
67
|
-
# def __delitem__(self, coordinate: BlockCoordinates) -> None:
|
|
68
|
-
# """
|
|
69
|
-
# Remove the :class:`BlockEntity` at ``coordinate``.
|
|
70
|
-
#
|
|
71
|
-
# :param coordinate: The coordinate to remove the block entity from.
|
|
72
|
-
# """
|
|
73
|
-
# del self._block_entities[coordinate]
|
|
74
|
-
#
|
|
75
|
-
# def __getitem__(self, coordinate: BlockCoordinates) -> BlockEntity:
|
|
76
|
-
# """
|
|
77
|
-
# Get the :class:`BlockEntity` at ``coordinate``.
|
|
78
|
-
#
|
|
79
|
-
# >>> block_entities: BlockEntityComponentData
|
|
80
|
-
# >>> x = y = z = 0
|
|
81
|
-
# >>> block_entity = block_entities[(x, y, z)]
|
|
82
|
-
#
|
|
83
|
-
# :param coordinate: The coordinate to find the block entity at.
|
|
84
|
-
# :return: The block entity at the specified coordinate.
|
|
85
|
-
# :raises:
|
|
86
|
-
# KeyError if there is no BlockEntity at the given coordinate.
|
|
87
|
-
# """
|
|
88
|
-
# return self._block_entities[coordinate]
|
|
89
|
-
#
|
|
90
|
-
# def __len__(self) -> int:
|
|
91
|
-
# return len(self._block_entities)
|
|
92
|
-
#
|
|
93
|
-
# def __iter__(self) -> Iterator[BlockCoordinates]:
|
|
94
|
-
# yield from self._block_entities
|
|
95
|
-
#
|
|
96
|
-
# def __repr__(self) -> str:
|
|
97
|
-
# return (
|
|
98
|
-
# f"BlockEntityContainer({self.version_range!r}) # {len(self)} block entities"
|
|
99
|
-
# )
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
# class BlockEntityComponent(
|
|
103
|
-
# ChunkComponent[BlockEntityComponentData, BlockEntityComponentData]
|
|
104
|
-
# ):
|
|
105
|
-
# storage_key = b"be"
|
|
106
|
-
#
|
|
107
|
-
# @staticmethod
|
|
108
|
-
# def fix_set_data(
|
|
109
|
-
# old_obj: BlockEntityComponentData | UnloadedComponent,
|
|
110
|
-
# new_obj: BlockEntityComponentData,
|
|
111
|
-
# ) -> BlockEntityComponentData:
|
|
112
|
-
# if not isinstance(new_obj, BlockEntityComponentData):
|
|
113
|
-
# raise TypeError
|
|
114
|
-
# assert isinstance(old_obj, BlockEntityComponentData)
|
|
115
|
-
# if old_obj.version_range != new_obj.version_range:
|
|
116
|
-
# raise ValueError("New version range does not match old version range.")
|
|
117
|
-
# return new_obj
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# from __future__ import annotations
|
|
2
|
-
# from typing import Iterator, Any
|
|
3
|
-
# from collections.abc import MutableSet
|
|
4
|
-
#
|
|
5
|
-
# from amulet.entity import Entity
|
|
6
|
-
# from amulet.version import VersionRange, VersionRangeContainer
|
|
7
|
-
# from .abc import ChunkComponent
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# class EntityComponentData(VersionRangeContainer, MutableSet[Entity]):
|
|
11
|
-
# _entities: set[Entity]
|
|
12
|
-
#
|
|
13
|
-
# def __init__(self, version_range: VersionRange):
|
|
14
|
-
# super().__init__(version_range)
|
|
15
|
-
# self._entities = set()
|
|
16
|
-
#
|
|
17
|
-
# def __getstate__(self) -> tuple[VersionRange, set[Entity]]: # type: ignore[override]
|
|
18
|
-
# return (
|
|
19
|
-
# super().__getstate__(),
|
|
20
|
-
# self._entities,
|
|
21
|
-
# )
|
|
22
|
-
#
|
|
23
|
-
# def __setstate__(self, state: tuple[VersionRange, set[Entity]]) -> None: # type: ignore[override]
|
|
24
|
-
# super().__setstate__(state[0])
|
|
25
|
-
# self._entities = state[1]
|
|
26
|
-
#
|
|
27
|
-
# def add(self, entity: Entity) -> None:
|
|
28
|
-
# if not isinstance(entity, Entity):
|
|
29
|
-
# raise TypeError("Expected an Entity")
|
|
30
|
-
# if not self.version_range.contains(entity.platform, entity.version):
|
|
31
|
-
# raise ValueError(
|
|
32
|
-
# f"entity {entity} is incompatible with {self.version_range}"
|
|
33
|
-
# )
|
|
34
|
-
# self._entities.add(entity)
|
|
35
|
-
#
|
|
36
|
-
# def discard(self, entity: Entity) -> None:
|
|
37
|
-
# self._entities.discard(entity)
|
|
38
|
-
#
|
|
39
|
-
# def __contains__(self, entity: object) -> bool:
|
|
40
|
-
# return entity in self._entities
|
|
41
|
-
#
|
|
42
|
-
# def __len__(self) -> int:
|
|
43
|
-
# return len(self._entities)
|
|
44
|
-
#
|
|
45
|
-
# def __iter__(self) -> Iterator[Entity]:
|
|
46
|
-
# yield from self._entities
|
|
47
|
-
#
|
|
48
|
-
# def __repr__(self) -> str:
|
|
49
|
-
# return f"EntityContainer({self.version_range!r}) # {len(self)} entities"
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# class EntityComponent(ChunkComponent[EntityComponentData, EntityComponentData]):
|
|
53
|
-
# storage_key = b"e"
|
|
54
|
-
#
|
|
55
|
-
# @staticmethod
|
|
56
|
-
# def fix_set_data(
|
|
57
|
-
# old_obj: EntityComponentData, new_obj: EntityComponentData
|
|
58
|
-
# ) -> EntityComponentData:
|
|
59
|
-
# if not isinstance(new_obj, EntityComponentData):
|
|
60
|
-
# raise TypeError
|
|
61
|
-
# assert isinstance(old_obj, EntityComponentData)
|
|
62
|
-
# if old_obj.version_range != new_obj.version_range:
|
|
63
|
-
# raise ValueError("New version range does not match old version range.")
|
|
64
|
-
# return new_obj
|
|
@@ -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
|