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.

Files changed (201) hide show
  1. amulet/__init__.cp311-win_amd64.pyd +0 -0
  2. amulet/__init__.py.cpp +4 -0
  3. amulet/__init__.pyi +0 -2
  4. amulet/_init.py +0 -2
  5. amulet/_version.py +3 -3
  6. amulet/biome.pyi +0 -2
  7. amulet/block.pyi +0 -2
  8. amulet/block_entity.pyi +0 -2
  9. amulet/chunk.pyi +0 -2
  10. amulet/chunk_components.pyi +20 -18
  11. amulet/collections/eq.py.hpp +1 -1
  12. amulet/collections/mapping.py.hpp +18 -11
  13. amulet/collections/mutable_mapping.py.hpp +17 -6
  14. amulet/collections/sequence.py.hpp +5 -6
  15. amulet/collections.pyi +8 -5
  16. amulet/entity.py +22 -20
  17. amulet/game/translate/_functions/_code_functions/_text.py +2 -2
  18. amulet/game/translate/_functions/abc.py +10 -3
  19. amulet/img/__init__.py +10 -0
  20. amulet/img/missing_no.png +0 -0
  21. amulet/img/missing_pack.png +0 -0
  22. amulet/level/__init__.pyi +2 -6
  23. amulet/level/abc/_level/_creatable_level.py +1 -2
  24. amulet/level/abc/_level/_level.py +1 -5
  25. amulet/level/java/__init__.pyi +0 -5
  26. amulet/level/java/_raw/__init__.pyi +0 -4
  27. amulet/level/java/_raw/java_chunk_decode.cpp +2 -4
  28. amulet/level/java/long_array.pyi +2 -1
  29. amulet/mesh/block/__init__.py +1 -0
  30. amulet/mesh/block/block_mesh.py +369 -0
  31. amulet/mesh/block/cube.py +149 -0
  32. amulet/mesh/block/missing_block.py +20 -0
  33. amulet/mesh/util.py +17 -0
  34. amulet/player.py +4 -6
  35. amulet/pybind11/collections.hpp +80 -38
  36. amulet/pybind11/numpy.hpp +26 -0
  37. amulet/pybind11/py_module.hpp +16 -51
  38. amulet/pybind11/type_hints.hpp +51 -0
  39. amulet/pybind11/types.hpp +14 -6
  40. amulet/pybind11/typing.hpp +7 -0
  41. amulet/resource_pack/__init__.py +62 -0
  42. amulet/resource_pack/abc/__init__.py +2 -0
  43. amulet/resource_pack/abc/resource_pack.py +38 -0
  44. amulet/resource_pack/abc/resource_pack_manager.py +87 -0
  45. amulet/resource_pack/bedrock/__init__.py +2 -0
  46. amulet/resource_pack/bedrock/bedrock_vanilla_fix/pack_icon.png +0 -0
  47. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_carried.png +0 -0
  48. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_side_carried.png +0 -0
  49. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/water.png +0 -0
  50. amulet/resource_pack/bedrock/blockshapes/__init__.py +31 -0
  51. amulet/resource_pack/bedrock/blockshapes/air.py +35 -0
  52. amulet/resource_pack/bedrock/blockshapes/base_blockshape.py +29 -0
  53. amulet/resource_pack/bedrock/blockshapes/bubble_column.py +29 -0
  54. amulet/resource_pack/bedrock/blockshapes/cake.py +46 -0
  55. amulet/resource_pack/bedrock/blockshapes/chest.py +54 -0
  56. amulet/resource_pack/bedrock/blockshapes/comparator.py +51 -0
  57. amulet/resource_pack/bedrock/blockshapes/cross_texture.py +186 -0
  58. amulet/resource_pack/bedrock/blockshapes/cross_texture0.py +17 -0
  59. amulet/resource_pack/bedrock/blockshapes/cross_texture_green.py +16 -0
  60. amulet/resource_pack/bedrock/blockshapes/cube.py +38 -0
  61. amulet/resource_pack/bedrock/blockshapes/default.py +14 -0
  62. amulet/resource_pack/bedrock/blockshapes/door.py +38 -0
  63. amulet/resource_pack/bedrock/blockshapes/door1.py +14 -0
  64. amulet/resource_pack/bedrock/blockshapes/door2.py +14 -0
  65. amulet/resource_pack/bedrock/blockshapes/door3.py +14 -0
  66. amulet/resource_pack/bedrock/blockshapes/door4.py +14 -0
  67. amulet/resource_pack/bedrock/blockshapes/door5.py +14 -0
  68. amulet/resource_pack/bedrock/blockshapes/door6.py +14 -0
  69. amulet/resource_pack/bedrock/blockshapes/double_plant.py +40 -0
  70. amulet/resource_pack/bedrock/blockshapes/enchanting_table.py +22 -0
  71. amulet/resource_pack/bedrock/blockshapes/farmland.py +22 -0
  72. amulet/resource_pack/bedrock/blockshapes/fence.py +22 -0
  73. amulet/resource_pack/bedrock/blockshapes/flat.py +55 -0
  74. amulet/resource_pack/bedrock/blockshapes/flat_wall.py +55 -0
  75. amulet/resource_pack/bedrock/blockshapes/furnace.py +44 -0
  76. amulet/resource_pack/bedrock/blockshapes/furnace_lit.py +14 -0
  77. amulet/resource_pack/bedrock/blockshapes/green_cube.py +39 -0
  78. amulet/resource_pack/bedrock/blockshapes/ladder.py +36 -0
  79. amulet/resource_pack/bedrock/blockshapes/lilypad.py +14 -0
  80. amulet/resource_pack/bedrock/blockshapes/partial_block.py +57 -0
  81. amulet/resource_pack/bedrock/blockshapes/piston.py +44 -0
  82. amulet/resource_pack/bedrock/blockshapes/piston_arm.py +72 -0
  83. amulet/resource_pack/bedrock/blockshapes/portal_frame.py +22 -0
  84. amulet/resource_pack/bedrock/blockshapes/pressure_plate.py +29 -0
  85. amulet/resource_pack/bedrock/blockshapes/pumpkin.py +36 -0
  86. amulet/resource_pack/bedrock/blockshapes/pumpkin_carved.py +14 -0
  87. amulet/resource_pack/bedrock/blockshapes/pumpkin_lit.py +14 -0
  88. amulet/resource_pack/bedrock/blockshapes/red_dust.py +14 -0
  89. amulet/resource_pack/bedrock/blockshapes/repeater.py +53 -0
  90. amulet/resource_pack/bedrock/blockshapes/slab.py +33 -0
  91. amulet/resource_pack/bedrock/blockshapes/slab_double.py +15 -0
  92. amulet/resource_pack/bedrock/blockshapes/tree.py +41 -0
  93. amulet/resource_pack/bedrock/blockshapes/turtle_egg.py +15 -0
  94. amulet/resource_pack/bedrock/blockshapes/vine.py +52 -0
  95. amulet/resource_pack/bedrock/blockshapes/wall.py +22 -0
  96. amulet/resource_pack/bedrock/blockshapes/water.py +38 -0
  97. amulet/resource_pack/bedrock/download_resources.py +147 -0
  98. amulet/resource_pack/bedrock/resource_pack.py +40 -0
  99. amulet/resource_pack/bedrock/resource_pack_manager.py +361 -0
  100. amulet/resource_pack/bedrock/sort_blockshapes.py +15 -0
  101. amulet/resource_pack/java/__init__.py +2 -0
  102. amulet/resource_pack/java/download_resources.py +212 -0
  103. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
  104. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
  105. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
  106. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
  107. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
  108. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
  109. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
  110. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
  111. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
  112. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
  113. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
  114. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
  115. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
  116. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
  117. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
  118. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
  119. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
  120. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
  121. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
  122. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
  123. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
  124. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
  125. amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
  126. amulet/resource_pack/java/resource_pack.py +44 -0
  127. amulet/resource_pack/java/resource_pack_manager.py +551 -0
  128. amulet/resource_pack/unknown_resource_pack.py +10 -0
  129. amulet/utils/__init__.pyi +0 -5
  130. amulet/utils/call_spec/_call_spec.py +2 -7
  131. amulet/utils/comment_json.py +188 -0
  132. amulet/utils/matrix.py +3 -3
  133. amulet/utils/numpy_helpers.py +2 -2
  134. amulet/utils/world_utils.py +2 -2
  135. amulet/version.pyi +0 -8
  136. {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/METADATA +2 -2
  137. amulet_core-2.0a7.dist-info/RECORD +295 -0
  138. amulet/chunk_/components/biome.py +0 -155
  139. amulet/chunk_/components/block_entity.py +0 -117
  140. amulet/chunk_/components/entity.py +0 -64
  141. amulet/chunk_/components/height_2d.py +0 -16
  142. amulet/level/bedrock/__init__.py +0 -2
  143. amulet/level/bedrock/_chunk_handle.py +0 -19
  144. amulet/level/bedrock/_dimension.py +0 -22
  145. amulet/level/bedrock/_level.py +0 -187
  146. amulet/level/bedrock/_raw/__init__.py +0 -5
  147. amulet/level/bedrock/_raw/_actor_counter.py +0 -53
  148. amulet/level/bedrock/_raw/_chunk.py +0 -54
  149. amulet/level/bedrock/_raw/_chunk_decode.py +0 -668
  150. amulet/level/bedrock/_raw/_chunk_encode.py +0 -602
  151. amulet/level/bedrock/_raw/_constant.py +0 -9
  152. amulet/level/bedrock/_raw/_dimension.py +0 -343
  153. amulet/level/bedrock/_raw/_level.py +0 -463
  154. amulet/level/bedrock/_raw/_level_dat.py +0 -90
  155. amulet/level/bedrock/_raw/_typing.py +0 -6
  156. amulet/level/bedrock/_raw/leveldb_chunk_versions.py +0 -83
  157. amulet/level/bedrock/chunk/__init__.py +0 -1
  158. amulet/level/bedrock/chunk/_chunk.py +0 -126
  159. amulet/level/bedrock/chunk/components/chunk_version.py +0 -12
  160. amulet/level/bedrock/chunk/components/finalised_state.py +0 -13
  161. amulet/level/bedrock/chunk/components/raw_chunk.py +0 -15
  162. amulet/level/construction/__init__.py +0 -0
  163. amulet/level/java/_chunk_handle.pyi +0 -15
  164. amulet/level/java/_dimension.pyi +0 -13
  165. amulet/level/java/_level.pyi +0 -120
  166. amulet/level/java/_raw/_chunk_decode.py +0 -561
  167. amulet/level/java/_raw/_chunk_encode.py +0 -463
  168. amulet/level/java/_raw/_constant.pyi +0 -20
  169. amulet/level/java/_raw/_data_pack/__init__.pyi +0 -8
  170. amulet/level/java/_raw/_data_pack/data_pack.pyi +0 -197
  171. amulet/level/java/_raw/_data_pack/data_pack_manager.pyi +0 -75
  172. amulet/level/java/_raw/_dimension.pyi +0 -72
  173. amulet/level/java/_raw/_level.pyi +0 -238
  174. amulet/level/java/_raw/_typing.pyi +0 -5
  175. amulet/level/java/anvil/__init__.pyi +0 -11
  176. amulet/level/java/anvil/_dimension.pyi +0 -109
  177. amulet/level/java/anvil/_region.pyi +0 -197
  178. amulet/level/java/anvil/_sector_manager.pyi +0 -142
  179. amulet/level/java_forge/__init__.py +0 -0
  180. amulet/level/mcstructure/__init__.py +0 -0
  181. amulet/level/nbt/__init__.py +0 -0
  182. amulet/level/schematic/__init__.py +0 -0
  183. amulet/level/sponge_schematic/__init__.py +0 -0
  184. amulet/pybind11/python.hpp +0 -14
  185. amulet/utils/call_spec/__init__.pyi +0 -53
  186. amulet/utils/call_spec/_call_spec.pyi +0 -272
  187. amulet/utils/matrix.pyi +0 -177
  188. amulet/utils/shareable_lock.pyi +0 -190
  189. amulet/utils/signal/__init__.pyi +0 -25
  190. amulet/utils/signal/_signal.pyi +0 -84
  191. amulet/utils/task_manager.pyi +0 -168
  192. amulet/utils/typing.py +0 -4
  193. amulet/utils/typing.pyi +0 -6
  194. amulet/utils/weakref.pyi +0 -50
  195. amulet/utils/world_utils.pyi +0 -109
  196. amulet_core-2.0a6.dist-info/RECORD +0 -253
  197. /amulet/img/{missing_world_icon.png → missing_world.png} +0 -0
  198. /amulet/{level/bedrock/chunk/components → mesh}/__init__.py +0 -0
  199. {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/WHEEL +0 -0
  200. {amulet_core-2.0a6.dist-info → amulet_core-2.0a7.dist-info}/entry_points.txt +0 -0
  201. {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
@@ -1,2 +0,0 @@
1
- from ._level import BedrockLevel
2
- from ._raw import BedrockLevelDAT, BedrockCreateArgsV1
@@ -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
- )
@@ -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,5 +0,0 @@
1
- from ._chunk import BedrockRawChunk
2
- from ._dimension import BedrockRawDimension
3
- from ._level import BedrockRawLevel, BedrockCreateArgsV1
4
- from ._level_dat import BedrockLevelDAT
5
- from ._typing import InternalDimension
@@ -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