amulet-core 2.0a5__cp312-cp312-macosx_10_13_universal2.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 (210) hide show
  1. amulet/__init__.cpython-312-darwin.so +0 -0
  2. amulet/__init__.pyi +30 -0
  3. amulet/__pyinstaller/__init__.py +2 -0
  4. amulet/__pyinstaller/hook-amulet.py +4 -0
  5. amulet/_init.py +28 -0
  6. amulet/_version.py +21 -0
  7. amulet/biome.cpp +36 -0
  8. amulet/biome.hpp +43 -0
  9. amulet/biome.pyi +77 -0
  10. amulet/block.cpp +435 -0
  11. amulet/block.hpp +119 -0
  12. amulet/block.pyi +273 -0
  13. amulet/block_entity.cpp +12 -0
  14. amulet/block_entity.hpp +56 -0
  15. amulet/block_entity.pyi +80 -0
  16. amulet/chunk.cpp +16 -0
  17. amulet/chunk.hpp +99 -0
  18. amulet/chunk.pyi +30 -0
  19. amulet/chunk_/components/biome.py +155 -0
  20. amulet/chunk_/components/block_entity.py +117 -0
  21. amulet/chunk_/components/entity.py +64 -0
  22. amulet/chunk_/components/height_2d.py +16 -0
  23. amulet/chunk_components.pyi +95 -0
  24. amulet/collections.pyi +37 -0
  25. amulet/data_types.py +29 -0
  26. amulet/entity.py +180 -0
  27. amulet/errors.py +63 -0
  28. amulet/game/__init__.py +7 -0
  29. amulet/game/_game.py +152 -0
  30. amulet/game/_universal/__init__.py +1 -0
  31. amulet/game/_universal/_biome.py +17 -0
  32. amulet/game/_universal/_block.py +47 -0
  33. amulet/game/_universal/_version.py +68 -0
  34. amulet/game/abc/__init__.py +22 -0
  35. amulet/game/abc/_block_specification.py +150 -0
  36. amulet/game/abc/biome.py +213 -0
  37. amulet/game/abc/block.py +331 -0
  38. amulet/game/abc/game_version_container.py +25 -0
  39. amulet/game/abc/json_interface.py +27 -0
  40. amulet/game/abc/version.py +44 -0
  41. amulet/game/bedrock/__init__.py +1 -0
  42. amulet/game/bedrock/_biome.py +35 -0
  43. amulet/game/bedrock/_block.py +42 -0
  44. amulet/game/bedrock/_version.py +165 -0
  45. amulet/game/java/__init__.py +2 -0
  46. amulet/game/java/_biome.py +35 -0
  47. amulet/game/java/_block.py +60 -0
  48. amulet/game/java/_version.py +176 -0
  49. amulet/game/translate/__init__.py +12 -0
  50. amulet/game/translate/_functions/__init__.py +15 -0
  51. amulet/game/translate/_functions/_code_functions/__init__.py +0 -0
  52. amulet/game/translate/_functions/_code_functions/_text.py +553 -0
  53. amulet/game/translate/_functions/_code_functions/banner_pattern.py +67 -0
  54. amulet/game/translate/_functions/_code_functions/bedrock_chest_connection.py +152 -0
  55. amulet/game/translate/_functions/_code_functions/bedrock_moving_block_pos.py +88 -0
  56. amulet/game/translate/_functions/_code_functions/bedrock_sign.py +152 -0
  57. amulet/game/translate/_functions/_code_functions/bedrock_skull_rotation.py +16 -0
  58. amulet/game/translate/_functions/_code_functions/custom_name.py +146 -0
  59. amulet/game/translate/_functions/_frozen.py +66 -0
  60. amulet/game/translate/_functions/_state.py +54 -0
  61. amulet/game/translate/_functions/_typing.py +98 -0
  62. amulet/game/translate/_functions/abc.py +116 -0
  63. amulet/game/translate/_functions/carry_nbt.py +160 -0
  64. amulet/game/translate/_functions/carry_properties.py +80 -0
  65. amulet/game/translate/_functions/code.py +143 -0
  66. amulet/game/translate/_functions/map_block_name.py +66 -0
  67. amulet/game/translate/_functions/map_nbt.py +111 -0
  68. amulet/game/translate/_functions/map_properties.py +93 -0
  69. amulet/game/translate/_functions/multiblock.py +112 -0
  70. amulet/game/translate/_functions/new_block.py +42 -0
  71. amulet/game/translate/_functions/new_entity.py +43 -0
  72. amulet/game/translate/_functions/new_nbt.py +206 -0
  73. amulet/game/translate/_functions/new_properties.py +64 -0
  74. amulet/game/translate/_functions/sequence.py +51 -0
  75. amulet/game/translate/_functions/walk_input_nbt.py +331 -0
  76. amulet/game/translate/_translator.py +433 -0
  77. amulet/item.py +75 -0
  78. amulet/level/__init__.pyi +27 -0
  79. amulet/level/_load.py +100 -0
  80. amulet/level/abc/__init__.py +12 -0
  81. amulet/level/abc/_chunk_handle.py +335 -0
  82. amulet/level/abc/_dimension.py +86 -0
  83. amulet/level/abc/_history/__init__.py +1 -0
  84. amulet/level/abc/_history/_cache.py +224 -0
  85. amulet/level/abc/_history/_history_manager.py +291 -0
  86. amulet/level/abc/_level/__init__.py +5 -0
  87. amulet/level/abc/_level/_compactable_level.py +10 -0
  88. amulet/level/abc/_level/_creatable_level.py +29 -0
  89. amulet/level/abc/_level/_disk_level.py +17 -0
  90. amulet/level/abc/_level/_level.py +453 -0
  91. amulet/level/abc/_level/_loadable_level.py +42 -0
  92. amulet/level/abc/_player_storage.py +7 -0
  93. amulet/level/abc/_raw_level.py +187 -0
  94. amulet/level/abc/_registry.py +40 -0
  95. amulet/level/bedrock/__init__.py +2 -0
  96. amulet/level/bedrock/_chunk_handle.py +19 -0
  97. amulet/level/bedrock/_dimension.py +22 -0
  98. amulet/level/bedrock/_level.py +187 -0
  99. amulet/level/bedrock/_raw/__init__.py +5 -0
  100. amulet/level/bedrock/_raw/_actor_counter.py +53 -0
  101. amulet/level/bedrock/_raw/_chunk.py +54 -0
  102. amulet/level/bedrock/_raw/_chunk_decode.py +668 -0
  103. amulet/level/bedrock/_raw/_chunk_encode.py +602 -0
  104. amulet/level/bedrock/_raw/_constant.py +9 -0
  105. amulet/level/bedrock/_raw/_dimension.py +343 -0
  106. amulet/level/bedrock/_raw/_level.py +463 -0
  107. amulet/level/bedrock/_raw/_level_dat.py +90 -0
  108. amulet/level/bedrock/_raw/_typing.py +6 -0
  109. amulet/level/bedrock/_raw/leveldb_chunk_versions.py +83 -0
  110. amulet/level/bedrock/chunk/__init__.py +1 -0
  111. amulet/level/bedrock/chunk/_chunk.py +126 -0
  112. amulet/level/bedrock/chunk/components/__init__.py +0 -0
  113. amulet/level/bedrock/chunk/components/chunk_version.py +12 -0
  114. amulet/level/bedrock/chunk/components/finalised_state.py +13 -0
  115. amulet/level/bedrock/chunk/components/raw_chunk.py +15 -0
  116. amulet/level/construction/__init__.py +0 -0
  117. amulet/level/java/__init__.pyi +21 -0
  118. amulet/level/java/_chunk_handle.py +17 -0
  119. amulet/level/java/_chunk_handle.pyi +15 -0
  120. amulet/level/java/_dimension.py +20 -0
  121. amulet/level/java/_dimension.pyi +13 -0
  122. amulet/level/java/_level.py +184 -0
  123. amulet/level/java/_level.pyi +120 -0
  124. amulet/level/java/_raw/__init__.pyi +19 -0
  125. amulet/level/java/_raw/_chunk.pyi +23 -0
  126. amulet/level/java/_raw/_chunk_decode.py +561 -0
  127. amulet/level/java/_raw/_chunk_encode.py +463 -0
  128. amulet/level/java/_raw/_constant.py +9 -0
  129. amulet/level/java/_raw/_constant.pyi +20 -0
  130. amulet/level/java/_raw/_data_pack/__init__.py +2 -0
  131. amulet/level/java/_raw/_data_pack/__init__.pyi +8 -0
  132. amulet/level/java/_raw/_data_pack/data_pack.py +241 -0
  133. amulet/level/java/_raw/_data_pack/data_pack.pyi +197 -0
  134. amulet/level/java/_raw/_data_pack/data_pack_manager.py +77 -0
  135. amulet/level/java/_raw/_data_pack/data_pack_manager.pyi +75 -0
  136. amulet/level/java/_raw/_dimension.py +86 -0
  137. amulet/level/java/_raw/_dimension.pyi +72 -0
  138. amulet/level/java/_raw/_level.py +507 -0
  139. amulet/level/java/_raw/_level.pyi +238 -0
  140. amulet/level/java/_raw/_typing.py +3 -0
  141. amulet/level/java/_raw/_typing.pyi +5 -0
  142. amulet/level/java/anvil/__init__.py +2 -0
  143. amulet/level/java/anvil/__init__.pyi +11 -0
  144. amulet/level/java/anvil/_dimension.py +170 -0
  145. amulet/level/java/anvil/_dimension.pyi +109 -0
  146. amulet/level/java/anvil/_region.py +421 -0
  147. amulet/level/java/anvil/_region.pyi +197 -0
  148. amulet/level/java/anvil/_sector_manager.py +223 -0
  149. amulet/level/java/anvil/_sector_manager.pyi +142 -0
  150. amulet/level/java/chunk.pyi +81 -0
  151. amulet/level/java/chunk_/_chunk.py +260 -0
  152. amulet/level/java/chunk_/components/inhabited_time.py +12 -0
  153. amulet/level/java/chunk_/components/last_update.py +12 -0
  154. amulet/level/java/chunk_/components/legacy_version.py +12 -0
  155. amulet/level/java/chunk_/components/light_populated.py +12 -0
  156. amulet/level/java/chunk_/components/named_height_2d.py +37 -0
  157. amulet/level/java/chunk_/components/status.py +11 -0
  158. amulet/level/java/chunk_/components/terrain_populated.py +12 -0
  159. amulet/level/java/chunk_components.pyi +22 -0
  160. amulet/level/java/long_array.pyi +38 -0
  161. amulet/level/java_forge/__init__.py +0 -0
  162. amulet/level/mcstructure/__init__.py +0 -0
  163. amulet/level/nbt/__init__.py +0 -0
  164. amulet/level/schematic/__init__.py +0 -0
  165. amulet/level/sponge_schematic/__init__.py +0 -0
  166. amulet/level/temporary_level/__init__.py +1 -0
  167. amulet/level/temporary_level/_level.py +16 -0
  168. amulet/palette/__init__.pyi +8 -0
  169. amulet/palette/biome_palette.pyi +45 -0
  170. amulet/palette/block_palette.pyi +45 -0
  171. amulet/player.py +64 -0
  172. amulet/py.typed +0 -0
  173. amulet/selection/__init__.py +2 -0
  174. amulet/selection/abstract_selection.py +342 -0
  175. amulet/selection/box.py +852 -0
  176. amulet/selection/group.py +481 -0
  177. amulet/utils/__init__.pyi +28 -0
  178. amulet/utils/call_spec/__init__.py +24 -0
  179. amulet/utils/call_spec/__init__.pyi +53 -0
  180. amulet/utils/call_spec/_call_spec.py +262 -0
  181. amulet/utils/call_spec/_call_spec.pyi +272 -0
  182. amulet/utils/format_utils.py +41 -0
  183. amulet/utils/generator.py +18 -0
  184. amulet/utils/matrix.py +243 -0
  185. amulet/utils/matrix.pyi +177 -0
  186. amulet/utils/numpy.pyi +11 -0
  187. amulet/utils/numpy_helpers.py +19 -0
  188. amulet/utils/shareable_lock.py +335 -0
  189. amulet/utils/shareable_lock.pyi +190 -0
  190. amulet/utils/signal/__init__.py +10 -0
  191. amulet/utils/signal/__init__.pyi +25 -0
  192. amulet/utils/signal/_signal.py +228 -0
  193. amulet/utils/signal/_signal.pyi +84 -0
  194. amulet/utils/task_manager.py +235 -0
  195. amulet/utils/task_manager.pyi +168 -0
  196. amulet/utils/typed_property.py +111 -0
  197. amulet/utils/typing.py +4 -0
  198. amulet/utils/typing.pyi +6 -0
  199. amulet/utils/weakref.py +70 -0
  200. amulet/utils/weakref.pyi +50 -0
  201. amulet/utils/world_utils.py +102 -0
  202. amulet/utils/world_utils.pyi +109 -0
  203. amulet/version.cpp +136 -0
  204. amulet/version.hpp +142 -0
  205. amulet/version.pyi +94 -0
  206. amulet_core-2.0a5.dist-info/METADATA +103 -0
  207. amulet_core-2.0a5.dist-info/RECORD +210 -0
  208. amulet_core-2.0a5.dist-info/WHEEL +5 -0
  209. amulet_core-2.0a5.dist-info/entry_points.txt +2 -0
  210. amulet_core-2.0a5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,126 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TypeVar, Self, TypeAlias, cast
4
+ from types import UnionType
5
+
6
+ import numpy
7
+
8
+ from amulet.version import VersionNumber, VersionRange
9
+ from amulet.chunk import Chunk, ComponentDataMapping
10
+ from amulet.block import BlockStack, Block
11
+ from amulet.biome import Biome
12
+
13
+ from amulet.chunk.components.biome import (
14
+ Biome2DComponent,
15
+ Biome2DComponentData,
16
+ Biome3DComponent,
17
+ Biome3DComponentData,
18
+ )
19
+ from amulet.chunk.components.block import BlockComponent, BlockComponentData
20
+ from amulet.chunk.components.block_entity import (
21
+ BlockEntityComponent,
22
+ BlockEntityComponentData,
23
+ )
24
+ from amulet.chunk.components.entity import EntityComponent, EntityComponentData
25
+ from amulet.chunk.components.height_2d import Height2DComponent
26
+
27
+ from .components.finalised_state import FinalisedStateComponent
28
+ from .components.chunk_version import ChunkVersionComponent
29
+ from .components.raw_chunk import RawChunkComponent
30
+
31
+ T = TypeVar("T")
32
+
33
+
34
+ def _get_components(
35
+ chunk_version: int,
36
+ version_range: VersionRange,
37
+ default_block: BlockStack,
38
+ default_biome: Biome,
39
+ ) -> ComponentDataMapping:
40
+ components: ComponentDataMapping = {} # type: ignore
41
+ components[RawChunkComponent] = None
42
+ components[ChunkVersionComponent] = chunk_version
43
+ components[FinalisedStateComponent] = 2
44
+ components[BlockComponent] = BlockComponentData(
45
+ version_range, (16, 16, 16), default_block
46
+ )
47
+ components[BlockEntityComponent] = BlockEntityComponentData(version_range)
48
+ components[EntityComponent] = EntityComponentData(version_range)
49
+ if chunk_version >= 29:
50
+ components[Biome3DComponent] = Biome3DComponentData(
51
+ version_range, (16, 16, 16), default_biome
52
+ )
53
+ else:
54
+ components[Biome2DComponent] = Biome2DComponentData(
55
+ version_range, (16, 16), default_biome
56
+ )
57
+ components[Height2DComponent] = numpy.zeros((16, 16), dtype=numpy.int64)
58
+ return components
59
+
60
+
61
+ class BedrockChunk0(Chunk):
62
+ components = frozenset(
63
+ _get_components(
64
+ 0,
65
+ VersionRange(
66
+ "bedrock",
67
+ VersionNumber(1, 0, 0),
68
+ VersionNumber(1, 0, 0),
69
+ ),
70
+ BlockStack(Block("bedrock", VersionNumber(1, 0, 0), "", "")),
71
+ Biome("bedrock", VersionNumber(1, 0, 0), "", ""),
72
+ )
73
+ )
74
+
75
+ @classmethod
76
+ def new(
77
+ cls, max_version: VersionNumber, default_block: BlockStack, default_biome: Biome
78
+ ) -> Self:
79
+ return cls.from_component_data(
80
+ _get_components(
81
+ 0,
82
+ VersionRange(
83
+ "bedrock",
84
+ VersionNumber(1, 0, 0),
85
+ max_version,
86
+ ),
87
+ default_block,
88
+ default_biome,
89
+ )
90
+ )
91
+
92
+
93
+ class BedrockChunk29(Chunk):
94
+ components = frozenset(
95
+ _get_components(
96
+ 29,
97
+ VersionRange(
98
+ "bedrock",
99
+ VersionNumber(1, 0, 0),
100
+ VersionNumber(1, 0, 0),
101
+ ),
102
+ BlockStack(Block("bedrock", VersionNumber(1, 0, 0), "", "")),
103
+ Biome("bedrock", VersionNumber(1, 0, 0), "", ""),
104
+ )
105
+ )
106
+
107
+ @classmethod
108
+ def new(
109
+ cls, max_version: VersionNumber, default_block: BlockStack, default_biome: Biome
110
+ ) -> Self:
111
+ return cls.from_component_data(
112
+ _get_components(
113
+ 29,
114
+ VersionRange(
115
+ "bedrock",
116
+ VersionNumber(1, 0, 0),
117
+ max_version,
118
+ ),
119
+ default_block,
120
+ default_biome,
121
+ )
122
+ )
123
+
124
+
125
+ # TODO: Improve this if python/mypy#11673 gets fixed.
126
+ BedrockChunk: TypeAlias = cast(UnionType, BedrockChunk0 | BedrockChunk29)
File without changes
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+ from amulet.chunk.components.abc import ChunkComponent
3
+
4
+
5
+ class ChunkVersionComponent(ChunkComponent[int, int]):
6
+ storage_key = b"bcv"
7
+
8
+ @staticmethod
9
+ def fix_set_data(old_obj: int, new_obj: int) -> int:
10
+ if not isinstance(new_obj, int):
11
+ raise TypeError
12
+ return new_obj
@@ -0,0 +1,13 @@
1
+ from amulet.chunk.components.abc import ChunkComponent
2
+
3
+
4
+ class FinalisedStateComponent(ChunkComponent[int, int]):
5
+ storage_key = b"bfs"
6
+
7
+ @staticmethod
8
+ def fix_set_data(old_obj: int, new_obj: int) -> int:
9
+ if not isinstance(new_obj, int):
10
+ raise TypeError
11
+ if new_obj < 0:
12
+ raise ValueError
13
+ return new_obj
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from amulet.level.bedrock._raw import BedrockRawChunk
3
+ from amulet.chunk.components.abc import ChunkComponent
4
+
5
+
6
+ class RawChunkComponent(ChunkComponent[BedrockRawChunk | None, BedrockRawChunk | None]):
7
+ storage_key = b"brc"
8
+
9
+ @staticmethod
10
+ def fix_set_data(
11
+ old_obj: BedrockRawChunk | None, new_obj: BedrockRawChunk | None
12
+ ) -> BedrockRawChunk | None:
13
+ if new_obj is None or isinstance(new_obj, BedrockRawChunk):
14
+ return new_obj
15
+ raise TypeError
File without changes
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from amulet.level.java._level import JavaLevel
6
+
7
+ from . import (
8
+ _chunk_handle,
9
+ _dimension,
10
+ _level,
11
+ _raw,
12
+ anvil,
13
+ chunk,
14
+ chunk_components,
15
+ long_array,
16
+ )
17
+
18
+ __all__ = ["JavaLevel", "anvil", "chunk", "chunk_components", "long_array"]
19
+
20
+ def __dir__() -> typing.Any: ...
21
+ def __getattr__(arg0: typing.Any) -> typing.Any: ...
@@ -0,0 +1,17 @@
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 JavaChunk
7
+
8
+ if TYPE_CHECKING:
9
+ from ._level import JavaLevel
10
+ from ._raw import JavaRawDimension
11
+
12
+
13
+ class JavaChunkHandle(ChunkHandle["JavaLevel", "JavaRawDimension", JavaChunk]):
14
+ @staticmethod
15
+ def _validate_chunk(chunk: ChunkT) -> None:
16
+ if not isinstance(chunk, JavaChunk):
17
+ raise TypeError
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ import amulet.level.abc._chunk_handle
6
+ from amulet.level.abc._chunk_handle import ChunkHandle
7
+ from amulet.level.java.chunk import JavaChunk
8
+
9
+ __all__ = ["ChunkHandle", "ChunkT", "JavaChunk", "JavaChunkHandle"]
10
+
11
+ class JavaChunkHandle(amulet.level.abc._chunk_handle.ChunkHandle):
12
+ @staticmethod
13
+ def _validate_chunk(chunk: ChunkT) -> None: ...
14
+
15
+ ChunkT: typing.TypeVar # value = ~ChunkT
@@ -0,0 +1,20 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from amulet.level.abc import Dimension
4
+ from ._chunk_handle import JavaChunkHandle
5
+
6
+ if TYPE_CHECKING:
7
+ from ._level import JavaLevel
8
+ from ._raw import JavaRawDimension
9
+
10
+
11
+ class JavaDimension(Dimension["JavaLevel", "JavaRawDimension", JavaChunkHandle]):
12
+ def _create_chunk_handle(self, cx: int, cz: int) -> JavaChunkHandle:
13
+ return JavaChunkHandle(
14
+ self._l_ref,
15
+ self._chunk_history,
16
+ self._chunk_data_history,
17
+ self.dimension_id,
18
+ cx,
19
+ cz,
20
+ )
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+
3
+ import amulet.level.abc._dimension
4
+ import amulet.level.java._chunk_handle
5
+ from amulet.level.abc._dimension import Dimension
6
+ from amulet.level.java._chunk_handle import JavaChunkHandle
7
+
8
+ __all__ = ["Dimension", "JavaChunkHandle", "JavaDimension"]
9
+
10
+ class JavaDimension(amulet.level.abc._dimension.Dimension):
11
+ def _create_chunk_handle(
12
+ self, cx: int, cz: int
13
+ ) -> amulet.level.java._chunk_handle.JavaChunkHandle: ...
@@ -0,0 +1,184 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Type, Callable
4
+ import os
5
+ import logging
6
+
7
+ from PIL import Image
8
+ from amulet_nbt import (
9
+ read_nbt,
10
+ )
11
+
12
+ from amulet.data_types import DimensionId
13
+ from amulet.level.abc import (
14
+ DiskLevel,
15
+ CreatableLevel,
16
+ LoadableLevel,
17
+ CompactableLevel,
18
+ LevelOpenData,
19
+ PlayerStorage,
20
+ )
21
+ from amulet.utils.call_spec import (
22
+ StringArg,
23
+ IntArg,
24
+ CallableArg,
25
+ BoolArg,
26
+ DirectoryPathArg,
27
+ PositionalArgs,
28
+ method_spec,
29
+ )
30
+ from amulet.utils.weakref import DetachableWeakRef
31
+ from amulet.level import register_level_class
32
+ from amulet.version import VersionNumber, PlatformType
33
+
34
+ from ._dimension import JavaDimension
35
+ from ._raw import JavaCreateArgsV1, JavaRawLevel, InternalDimensionId
36
+ from amulet.chunk import Chunk
37
+
38
+ log = logging.getLogger(__name__)
39
+
40
+
41
+ class JavaLevelOpenData(LevelOpenData):
42
+ back_reference: Callable[[], JavaLevel | None]
43
+ detach_back_reference: Callable[[], None]
44
+ dimensions: dict[DimensionId | InternalDimensionId, JavaDimension]
45
+
46
+ def __init__(self, level: JavaLevel) -> None:
47
+ super().__init__()
48
+ self.back_reference, self.detach_back_reference = DetachableWeakRef.new(level)
49
+ self.dimensions = {}
50
+
51
+
52
+ class JavaLevel(
53
+ DiskLevel[JavaLevelOpenData, JavaDimension, JavaRawLevel],
54
+ CreatableLevel,
55
+ LoadableLevel,
56
+ CompactableLevel,
57
+ ):
58
+ __slots__ = ("_raw_level",)
59
+
60
+ def __init__(self, _ikwiad: bool = False) -> None:
61
+ if not _ikwiad:
62
+ raise RuntimeError(
63
+ "BedrockRawLevel must be constructed using the create or load classmethod."
64
+ )
65
+ super().__init__()
66
+
67
+ def __init(self, raw: JavaRawLevel) -> None:
68
+ self._raw_level = raw
69
+ self._raw_level.opened.connect(self.open)
70
+ self._raw_level.closed.connect(self.close)
71
+
72
+ @classmethod
73
+ @method_spec(
74
+ CallableArg(
75
+ JavaCreateArgsV1,
76
+ BoolArg(True),
77
+ DirectoryPathArg(),
78
+ CallableArg(
79
+ VersionNumber,
80
+ PositionalArgs(IntArg(min_value=0), (IntArg(1), IntArg(20))),
81
+ ),
82
+ StringArg("New World"),
83
+ )
84
+ )
85
+ def create(cls, args: JavaCreateArgsV1) -> JavaLevel:
86
+ raw = JavaRawLevel.create(args)
87
+ self = cls(True)
88
+ self.__init(raw)
89
+ return self
90
+
91
+ @staticmethod
92
+ def can_load(token: Any) -> bool:
93
+ if (
94
+ isinstance(token, str)
95
+ and os.path.isdir(token)
96
+ and os.path.isfile(os.path.join(token, "level.dat"))
97
+ ):
98
+ try:
99
+ level_dat_root = read_nbt(os.path.join(token, "level.dat")).compound
100
+ except Exception:
101
+ pass
102
+ else:
103
+ return "Data" in level_dat_root and "FML" not in level_dat_root
104
+ return False
105
+
106
+ @classmethod
107
+ def load(cls, path: str) -> JavaLevel:
108
+ raw = JavaRawLevel.load(path)
109
+ self = cls(True)
110
+ self.__init(raw)
111
+ return self
112
+
113
+ def reload(self) -> None:
114
+ self.raw.reload()
115
+
116
+ def _open(self) -> None:
117
+ self.raw.open()
118
+ self._open_data = JavaLevelOpenData(self)
119
+
120
+ def _close(self) -> None:
121
+ self._o.detach_back_reference()
122
+ self._open_data = None
123
+ self.raw.close()
124
+
125
+ def save(self) -> None:
126
+ raise NotImplementedError
127
+
128
+ @property
129
+ def platform(self) -> PlatformType:
130
+ return self.raw.platform
131
+
132
+ @property
133
+ def max_game_version(self) -> VersionNumber:
134
+ return self.raw.data_version
135
+
136
+ @property
137
+ def level_name(self) -> str:
138
+ return self.raw.level_name
139
+
140
+ @property
141
+ def modified_time(self) -> float:
142
+ return self.raw.modified_time
143
+
144
+ @property
145
+ def path(self) -> str:
146
+ return self.raw.path
147
+
148
+ @property
149
+ def thumbnail(self) -> Image.Image:
150
+ try:
151
+ return Image.open(os.path.join(self.path, "icon.png"))
152
+ except Exception:
153
+ return super().thumbnail
154
+
155
+ def dimension_ids(self) -> frozenset[DimensionId]:
156
+ return self.raw.dimension_ids()
157
+
158
+ def get_dimension(
159
+ self, dimension_id: DimensionId | InternalDimensionId
160
+ ) -> JavaDimension:
161
+ if dimension_id not in self._o.dimensions:
162
+ raw_dimension = self.raw.get_dimension(dimension_id)
163
+ self._o.dimensions[raw_dimension.dimension_id] = self._o.dimensions[
164
+ raw_dimension.relative_path
165
+ ] = JavaDimension(self._o.back_reference, raw_dimension.dimension_id)
166
+ return self._o.dimensions[dimension_id]
167
+
168
+ @property
169
+ def player(self) -> PlayerStorage:
170
+ raise NotImplementedError
171
+
172
+ @property
173
+ def native_chunk_class(self) -> Type[Chunk]:
174
+ raise NotImplementedError
175
+
176
+ @property
177
+ def raw(self) -> JavaRawLevel:
178
+ return self._raw_level
179
+
180
+ def compact(self) -> None:
181
+ self.raw.compact()
182
+
183
+
184
+ register_level_class(JavaLevel)
@@ -0,0 +1,120 @@
1
+ from __future__ import annotations
2
+
3
+ import logging as logging
4
+ import os as os
5
+ import typing
6
+ from builtins import str as DimensionId
7
+ from builtins import str as InternalDimensionId
8
+ from builtins import str as PlatformType
9
+ from typing import Any
10
+
11
+ import amulet.level.abc._level._compactable_level
12
+ import amulet.level.abc._level._creatable_level
13
+ import amulet.level.abc._level._disk_level
14
+ import amulet.level.abc._level._level
15
+ import amulet.level.abc._level._loadable_level
16
+ from amulet.chunk import Chunk
17
+ from amulet.level._load import register_level_class
18
+ from amulet.level.abc._level._compactable_level import CompactableLevel
19
+ from amulet.level.abc._level._creatable_level import CreatableLevel
20
+ from amulet.level.abc._level._disk_level import DiskLevel
21
+ from amulet.level.abc._level._level import LevelOpenData
22
+ from amulet.level.abc._level._loadable_level import LoadableLevel
23
+ from amulet.level.abc._player_storage import PlayerStorage
24
+ from amulet.level.java._dimension import JavaDimension
25
+ from amulet.level.java._raw._level import JavaCreateArgsV1, JavaRawLevel
26
+ from amulet.utils.call_spec._call_spec import (
27
+ BoolArg,
28
+ CallableArg,
29
+ DirectoryPathArg,
30
+ IntArg,
31
+ PositionalArgs,
32
+ StringArg,
33
+ method_spec,
34
+ )
35
+ from amulet.utils.weakref import DetachableWeakRef
36
+ from amulet.version import VersionNumber
37
+ from amulet_nbt import read_nbt
38
+ from PIL import Image
39
+
40
+ __all__ = [
41
+ "Any",
42
+ "BoolArg",
43
+ "CallableArg",
44
+ "Chunk",
45
+ "CompactableLevel",
46
+ "CreatableLevel",
47
+ "DetachableWeakRef",
48
+ "DimensionId",
49
+ "DirectoryPathArg",
50
+ "DiskLevel",
51
+ "Image",
52
+ "IntArg",
53
+ "InternalDimensionId",
54
+ "JavaCreateArgsV1",
55
+ "JavaDimension",
56
+ "JavaLevel",
57
+ "JavaLevelOpenData",
58
+ "JavaRawLevel",
59
+ "LevelOpenData",
60
+ "LoadableLevel",
61
+ "PlatformType",
62
+ "PlayerStorage",
63
+ "PositionalArgs",
64
+ "StringArg",
65
+ "VersionNumber",
66
+ "log",
67
+ "logging",
68
+ "method_spec",
69
+ "os",
70
+ "read_nbt",
71
+ "register_level_class",
72
+ ]
73
+
74
+ class JavaLevel(
75
+ amulet.level.abc._level._disk_level.DiskLevel,
76
+ amulet.level.abc._level._creatable_level.CreatableLevel,
77
+ amulet.level.abc._level._loadable_level.LoadableLevel,
78
+ amulet.level.abc._level._compactable_level.CompactableLevel,
79
+ ):
80
+ __slots__: typing.ClassVar[tuple] = "_raw_level"
81
+ @staticmethod
82
+ def can_load(token: typing.Any) -> bool: ...
83
+ @classmethod
84
+ def create(cls, args: JavaCreateArgsV1) -> JavaLevel: ...
85
+ @classmethod
86
+ def load(cls, path: str) -> JavaLevel: ...
87
+ def _JavaLevel__init(self, raw: JavaRawLevel) -> None: ...
88
+ def __init__(self, _ikwiad: bool = False) -> None: ...
89
+ def _close(self) -> None: ...
90
+ def _open(self) -> None: ...
91
+ def compact(self) -> None: ...
92
+ def dimension_ids(self) -> frozenset[DimensionId]: ...
93
+ def get_dimension(
94
+ self, dimension_id: DimensionId | InternalDimensionId
95
+ ) -> JavaDimension: ...
96
+ def reload(self) -> None: ...
97
+ def save(self) -> None: ...
98
+ @property
99
+ def level_name(self) -> str: ...
100
+ @property
101
+ def max_game_version(self) -> VersionNumber: ...
102
+ @property
103
+ def modified_time(self) -> float: ...
104
+ @property
105
+ def native_chunk_class(self) -> Type[Chunk]: ...
106
+ @property
107
+ def path(self) -> str: ...
108
+ @property
109
+ def platform(self) -> PlatformType: ...
110
+ @property
111
+ def player(self) -> PlayerStorage: ...
112
+ @property
113
+ def raw(self) -> JavaRawLevel: ...
114
+ @property
115
+ def thumbnail(self) -> Image.Image: ...
116
+
117
+ class JavaLevelOpenData(amulet.level.abc._level._level.LevelOpenData):
118
+ def __init__(self, level: JavaLevel) -> None: ...
119
+
120
+ log: logging.Logger # value = <Logger amulet.level.java._level (INFO)>
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from builtins import str as InternalDimensionId
5
+
6
+ from amulet.level.java._raw._dimension import JavaRawDimension
7
+ from amulet.level.java._raw._level import JavaCreateArgsV1, JavaRawLevel
8
+
9
+ from . import _chunk, _constant, _data_pack, _dimension, _level, _typing
10
+
11
+ __all__ = [
12
+ "InternalDimensionId",
13
+ "JavaCreateArgsV1",
14
+ "JavaRawDimension",
15
+ "JavaRawLevel",
16
+ ]
17
+
18
+ def __dir__() -> typing.Any: ...
19
+ def __getattr__(arg0: typing.Any) -> typing.Any: ...
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ import amulet.level.java.chunk
6
+ import amulet_nbt
7
+
8
+ __all__ = ["decode_chunk", "encode_chunk"]
9
+
10
+ def decode_chunk(
11
+ arg0: typing.Any,
12
+ arg1: typing.Any,
13
+ arg2: dict[str, amulet_nbt.NamedTag],
14
+ arg3: int,
15
+ arg4: int,
16
+ ) -> amulet.level.java.chunk.JavaChunk: ...
17
+ def encode_chunk(
18
+ arg0: typing.Any,
19
+ arg1: typing.Any,
20
+ arg2: amulet.level.java.chunk.JavaChunk,
21
+ arg3: int,
22
+ arg4: int,
23
+ ) -> dict[str, amulet_nbt.NamedTag]: ...