amulet-core 2.0a8__cp311-cp311-win_amd64.whl → 2.0.1.0.1297307203.19.43.34808.0a1__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 (271) hide show
  1. amulet/core/__init__.py +36 -0
  2. amulet/core/__pyinstaller/hook-amulet.core.py +4 -0
  3. amulet/core/_amulet_core.cp311-win_amd64.pyd +0 -0
  4. amulet/core/_amulet_core.pyi +7 -0
  5. amulet/{_version.py → core/_version.py} +3 -3
  6. amulet/core/amulet_core.dll +0 -0
  7. amulet/core/amulet_core.lib +0 -0
  8. amulet/core/amulet_coreConfig.cmake +18 -0
  9. amulet/{biome.pyi → core/biome/__init__.pyi} +3 -3
  10. amulet/core/biome/biome.hpp +53 -0
  11. amulet/{block.pyi → core/block/__init__.pyi} +25 -26
  12. amulet/core/block/block.hpp +156 -0
  13. amulet/{block_entity.pyi → core/block_entity/__init__.pyi} +7 -7
  14. amulet/core/block_entity/block_entity.hpp +84 -0
  15. amulet/{errors.py → core/chunk/__init__.pyi} +37 -33
  16. amulet/core/chunk/chunk.hpp +126 -0
  17. amulet/core/chunk/component/__init__.pyi +18 -0
  18. amulet/core/chunk/component/biome_3d_component.hpp +96 -0
  19. amulet/core/chunk/component/block_component.hpp +101 -0
  20. amulet/core/chunk/component/block_component.pyi +28 -0
  21. amulet/core/chunk/component/block_entity_component.hpp +119 -0
  22. amulet/core/chunk/component/section_array_map.hpp +129 -0
  23. amulet/{chunk_components.pyi → core/chunk/component/section_array_map.pyi} +4 -24
  24. amulet/core/dll.hpp +21 -0
  25. amulet/core/entity/__init__.pyi +105 -0
  26. amulet/core/entity/entity.hpp +100 -0
  27. amulet/{palette → core/palette}/__init__.pyi +2 -2
  28. amulet/core/palette/biome_palette.hpp +65 -0
  29. amulet/{palette → core/palette}/biome_palette.pyi +8 -8
  30. amulet/core/palette/block_palette.hpp +71 -0
  31. amulet/{palette → core/palette}/block_palette.pyi +12 -10
  32. amulet/core/selection/__init__.pyi +8 -0
  33. amulet/core/selection/box.hpp +86 -0
  34. amulet/core/selection/box.pyi +215 -0
  35. amulet/core/selection/group.hpp +80 -0
  36. amulet/core/selection/group.pyi +213 -0
  37. amulet/{version.pyi → core/version/__init__.pyi} +58 -10
  38. amulet/core/version/version.hpp +204 -0
  39. {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a1.dist-info}/METADATA +25 -20
  40. amulet_core-2.0.1.0.1297307203.19.43.34808.0a1.dist-info/RECORD +45 -0
  41. {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a1.dist-info}/WHEEL +1 -1
  42. amulet_core-2.0.1.0.1297307203.19.43.34808.0a1.dist-info/entry_points.txt +2 -0
  43. amulet/__init__.cp311-win_amd64.pyd +0 -0
  44. amulet/__init__.py.cpp +0 -45
  45. amulet/__init__.pyi +0 -30
  46. amulet/__pyinstaller/hook-amulet.py +0 -4
  47. amulet/_init.py +0 -26
  48. amulet/biome.cpp +0 -36
  49. amulet/biome.hpp +0 -43
  50. amulet/biome.py.cpp +0 -122
  51. amulet/block.cpp +0 -435
  52. amulet/block.hpp +0 -119
  53. amulet/block.py.cpp +0 -377
  54. amulet/block_entity.cpp +0 -12
  55. amulet/block_entity.hpp +0 -56
  56. amulet/block_entity.py.cpp +0 -115
  57. amulet/chunk.cpp +0 -16
  58. amulet/chunk.hpp +0 -100
  59. amulet/chunk.py.cpp +0 -80
  60. amulet/chunk.pyi +0 -28
  61. amulet/chunk_components/biome_3d_component.cpp +0 -5
  62. amulet/chunk_components/biome_3d_component.hpp +0 -79
  63. amulet/chunk_components/block_component.cpp +0 -41
  64. amulet/chunk_components/block_component.hpp +0 -88
  65. amulet/chunk_components/block_entity_component.cpp +0 -5
  66. amulet/chunk_components/block_entity_component.hpp +0 -147
  67. amulet/chunk_components/section_array_map.cpp +0 -129
  68. amulet/chunk_components/section_array_map.hpp +0 -147
  69. amulet/collections/eq.py.hpp +0 -37
  70. amulet/collections/hash.py.hpp +0 -27
  71. amulet/collections/holder.py.hpp +0 -37
  72. amulet/collections/iterator.py.hpp +0 -80
  73. amulet/collections/mapping.py.hpp +0 -199
  74. amulet/collections/mutable_mapping.py.hpp +0 -226
  75. amulet/collections/sequence.py.hpp +0 -163
  76. amulet/collections.pyi +0 -40
  77. amulet/data_types.py +0 -29
  78. amulet/entity.py +0 -182
  79. amulet/game/__init__.py +0 -7
  80. amulet/game/_game.py +0 -152
  81. amulet/game/_universal/__init__.py +0 -1
  82. amulet/game/_universal/_biome.py +0 -17
  83. amulet/game/_universal/_block.py +0 -47
  84. amulet/game/_universal/_version.py +0 -68
  85. amulet/game/abc/__init__.py +0 -22
  86. amulet/game/abc/_block_specification.py +0 -150
  87. amulet/game/abc/biome.py +0 -213
  88. amulet/game/abc/block.py +0 -331
  89. amulet/game/abc/game_version_container.py +0 -25
  90. amulet/game/abc/json_interface.py +0 -27
  91. amulet/game/abc/version.py +0 -44
  92. amulet/game/bedrock/__init__.py +0 -1
  93. amulet/game/bedrock/_biome.py +0 -35
  94. amulet/game/bedrock/_block.py +0 -42
  95. amulet/game/bedrock/_version.py +0 -165
  96. amulet/game/java/__init__.py +0 -2
  97. amulet/game/java/_biome.py +0 -35
  98. amulet/game/java/_block.py +0 -60
  99. amulet/game/java/_version.py +0 -176
  100. amulet/game/translate/__init__.py +0 -12
  101. amulet/game/translate/_functions/__init__.py +0 -15
  102. amulet/game/translate/_functions/_code_functions/__init__.py +0 -0
  103. amulet/game/translate/_functions/_code_functions/_text.py +0 -553
  104. amulet/game/translate/_functions/_code_functions/banner_pattern.py +0 -67
  105. amulet/game/translate/_functions/_code_functions/bedrock_chest_connection.py +0 -152
  106. amulet/game/translate/_functions/_code_functions/bedrock_moving_block_pos.py +0 -88
  107. amulet/game/translate/_functions/_code_functions/bedrock_sign.py +0 -152
  108. amulet/game/translate/_functions/_code_functions/bedrock_skull_rotation.py +0 -16
  109. amulet/game/translate/_functions/_code_functions/custom_name.py +0 -146
  110. amulet/game/translate/_functions/_frozen.py +0 -66
  111. amulet/game/translate/_functions/_state.py +0 -54
  112. amulet/game/translate/_functions/_typing.py +0 -98
  113. amulet/game/translate/_functions/abc.py +0 -123
  114. amulet/game/translate/_functions/carry_nbt.py +0 -160
  115. amulet/game/translate/_functions/carry_properties.py +0 -80
  116. amulet/game/translate/_functions/code.py +0 -143
  117. amulet/game/translate/_functions/map_block_name.py +0 -66
  118. amulet/game/translate/_functions/map_nbt.py +0 -111
  119. amulet/game/translate/_functions/map_properties.py +0 -93
  120. amulet/game/translate/_functions/multiblock.py +0 -112
  121. amulet/game/translate/_functions/new_block.py +0 -42
  122. amulet/game/translate/_functions/new_entity.py +0 -43
  123. amulet/game/translate/_functions/new_nbt.py +0 -206
  124. amulet/game/translate/_functions/new_properties.py +0 -64
  125. amulet/game/translate/_functions/sequence.py +0 -51
  126. amulet/game/translate/_functions/walk_input_nbt.py +0 -331
  127. amulet/game/translate/_translator.py +0 -433
  128. amulet/img/__init__.py +0 -10
  129. amulet/img/missing_no.png +0 -0
  130. amulet/img/missing_pack.png +0 -0
  131. amulet/img/missing_world.png +0 -0
  132. amulet/io/binary_reader.hpp +0 -45
  133. amulet/io/binary_writer.hpp +0 -30
  134. amulet/item.py +0 -75
  135. amulet/level/__init__.pyi +0 -23
  136. amulet/level/_load.py +0 -100
  137. amulet/level/abc/__init__.py +0 -12
  138. amulet/level/abc/_chunk_handle.py +0 -358
  139. amulet/level/abc/_dimension.py +0 -86
  140. amulet/level/abc/_history/__init__.py +0 -1
  141. amulet/level/abc/_history/_cache.py +0 -224
  142. amulet/level/abc/_history/_history_manager.py +0 -291
  143. amulet/level/abc/_level/__init__.py +0 -5
  144. amulet/level/abc/_level/_compactable_level.py +0 -10
  145. amulet/level/abc/_level/_creatable_level.py +0 -28
  146. amulet/level/abc/_level/_disk_level.py +0 -17
  147. amulet/level/abc/_level/_level.py +0 -449
  148. amulet/level/abc/_level/_loadable_level.py +0 -42
  149. amulet/level/abc/_player_storage.py +0 -7
  150. amulet/level/abc/_raw_level.py +0 -187
  151. amulet/level/abc/_registry.py +0 -40
  152. amulet/level/java/__init__.pyi +0 -16
  153. amulet/level/java/_chunk_handle.py +0 -17
  154. amulet/level/java/_dimension.py +0 -20
  155. amulet/level/java/_level.py +0 -184
  156. amulet/level/java/_raw/__init__.pyi +0 -15
  157. amulet/level/java/_raw/_chunk.pyi +0 -23
  158. amulet/level/java/_raw/_constant.py +0 -9
  159. amulet/level/java/_raw/_data_pack/__init__.py +0 -2
  160. amulet/level/java/_raw/_data_pack/data_pack.py +0 -241
  161. amulet/level/java/_raw/_data_pack/data_pack_manager.py +0 -77
  162. amulet/level/java/_raw/_dimension.py +0 -86
  163. amulet/level/java/_raw/_level.py +0 -507
  164. amulet/level/java/_raw/_typing.py +0 -3
  165. amulet/level/java/_raw/java_chunk_decode.cpp +0 -531
  166. amulet/level/java/_raw/java_chunk_decode.hpp +0 -23
  167. amulet/level/java/_raw/java_chunk_encode.cpp +0 -25
  168. amulet/level/java/_raw/java_chunk_encode.hpp +0 -23
  169. amulet/level/java/anvil/__init__.py +0 -2
  170. amulet/level/java/anvil/_dimension.py +0 -170
  171. amulet/level/java/anvil/_region.py +0 -421
  172. amulet/level/java/anvil/_sector_manager.py +0 -223
  173. amulet/level/java/chunk.pyi +0 -81
  174. amulet/level/java/chunk_/_chunk.py +0 -260
  175. amulet/level/java/chunk_/components/inhabited_time.py +0 -12
  176. amulet/level/java/chunk_/components/last_update.py +0 -12
  177. amulet/level/java/chunk_/components/legacy_version.py +0 -12
  178. amulet/level/java/chunk_/components/light_populated.py +0 -12
  179. amulet/level/java/chunk_/components/named_height_2d.py +0 -37
  180. amulet/level/java/chunk_/components/status.py +0 -11
  181. amulet/level/java/chunk_/components/terrain_populated.py +0 -12
  182. amulet/level/java/chunk_components/data_version_component.cpp +0 -32
  183. amulet/level/java/chunk_components/data_version_component.hpp +0 -31
  184. amulet/level/java/chunk_components/java_raw_chunk_component.cpp +0 -56
  185. amulet/level/java/chunk_components/java_raw_chunk_component.hpp +0 -45
  186. amulet/level/java/chunk_components.pyi +0 -22
  187. amulet/level/java/java_chunk.cpp +0 -170
  188. amulet/level/java/java_chunk.hpp +0 -141
  189. amulet/level/java/long_array.hpp +0 -175
  190. amulet/level/java/long_array.pyi +0 -39
  191. amulet/level/temporary_level/__init__.py +0 -1
  192. amulet/level/temporary_level/_level.py +0 -16
  193. amulet/mesh/__init__.py +0 -0
  194. amulet/mesh/block/__init__.pyi +0 -301
  195. amulet/mesh/block/_cube.py +0 -198
  196. amulet/mesh/block/_missing_block.py +0 -20
  197. amulet/mesh/block/block_mesh.cpp +0 -107
  198. amulet/mesh/block/block_mesh.hpp +0 -207
  199. amulet/mesh/util.py +0 -17
  200. amulet/palette/biome_palette.hpp +0 -85
  201. amulet/palette/block_palette.cpp +0 -32
  202. amulet/palette/block_palette.hpp +0 -93
  203. amulet/player.py +0 -62
  204. amulet/pybind11/collections.hpp +0 -118
  205. amulet/pybind11/numpy.hpp +0 -26
  206. amulet/pybind11/py_module.hpp +0 -34
  207. amulet/pybind11/type_hints.hpp +0 -51
  208. amulet/pybind11/types.hpp +0 -25
  209. amulet/pybind11/typing.hpp +0 -7
  210. amulet/resource_pack/__init__.py +0 -63
  211. amulet/resource_pack/abc/__init__.py +0 -2
  212. amulet/resource_pack/abc/resource_pack.py +0 -38
  213. amulet/resource_pack/abc/resource_pack_manager.py +0 -85
  214. amulet/resource_pack/java/__init__.py +0 -2
  215. amulet/resource_pack/java/download_resources.py +0 -212
  216. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
  217. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
  218. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
  219. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
  220. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
  221. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
  222. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
  223. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
  224. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
  225. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
  226. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
  227. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
  228. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
  229. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
  230. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
  231. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
  232. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
  233. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
  234. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
  235. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
  236. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
  237. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
  238. amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
  239. amulet/resource_pack/java/resource_pack.py +0 -44
  240. amulet/resource_pack/java/resource_pack_manager.py +0 -563
  241. amulet/resource_pack/unknown_resource_pack.py +0 -10
  242. amulet/selection/__init__.py +0 -2
  243. amulet/selection/abstract_selection.py +0 -342
  244. amulet/selection/box.py +0 -852
  245. amulet/selection/group.py +0 -481
  246. amulet/utils/__init__.pyi +0 -23
  247. amulet/utils/call_spec/__init__.py +0 -24
  248. amulet/utils/call_spec/_call_spec.py +0 -257
  249. amulet/utils/cast.py +0 -10
  250. amulet/utils/comment_json.py +0 -188
  251. amulet/utils/format_utils.py +0 -41
  252. amulet/utils/generator.py +0 -18
  253. amulet/utils/matrix.py +0 -243
  254. amulet/utils/numpy.hpp +0 -36
  255. amulet/utils/numpy.pyi +0 -11
  256. amulet/utils/numpy_helpers.py +0 -19
  257. amulet/utils/shareable_lock.py +0 -335
  258. amulet/utils/signal/__init__.py +0 -10
  259. amulet/utils/signal/_signal.py +0 -228
  260. amulet/utils/task_manager.py +0 -235
  261. amulet/utils/typed_property.py +0 -111
  262. amulet/utils/weakref.py +0 -70
  263. amulet/utils/world_utils.py +0 -102
  264. amulet/version.cpp +0 -136
  265. amulet/version.hpp +0 -142
  266. amulet/version.py.cpp +0 -281
  267. amulet_core-2.0a8.dist-info/RECORD +0 -241
  268. amulet_core-2.0a8.dist-info/entry_points.txt +0 -2
  269. /amulet/{__pyinstaller → core/__pyinstaller}/__init__.py +0 -0
  270. /amulet/{py.typed → core/py.typed} +0 -0
  271. {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a1.dist-info}/top_level.txt +0 -0
amulet/game/abc/block.py DELETED
@@ -1,331 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from typing import Callable, TYPE_CHECKING, TypeVar
5
- from collections.abc import Mapping, Collection
6
- from copy import deepcopy
7
-
8
- from amulet.block import Block
9
- from amulet.block_entity import BlockEntity
10
- from amulet.entity import Entity
11
- from amulet.data_types import BlockCoordinates
12
- from amulet.version import VersionNumber
13
- from amulet.game import get_game_version
14
-
15
- from ._block_specification import BlockSpec
16
- from .game_version_container import GameVersionContainer
17
-
18
- T = TypeVar("T")
19
-
20
- if TYPE_CHECKING:
21
- from .version import GameVersion
22
- from amulet.game.translate import (
23
- BlockToUniversalTranslator,
24
- BlockFromUniversalTranslator,
25
- )
26
-
27
-
28
- class BlockTranslationError(Exception):
29
- """An exception raised if the block could not be translated."""
30
-
31
-
32
- class BlockData(GameVersionContainer, ABC):
33
- def __init__(
34
- self,
35
- game_version: GameVersion,
36
- specification: Mapping[str, Mapping[str, BlockSpec]],
37
- ) -> None:
38
- super().__init__(game_version)
39
- self._spec = specification
40
-
41
- def __getstate__(self) -> dict:
42
- state = super().__getstate__()
43
- state["_spec"] = self._spec
44
- return state
45
-
46
- def __setstate__(self, state: dict) -> None:
47
- super().__setstate__(state)
48
- self._spec = state["_spec"]
49
-
50
- def namespaces(self) -> Collection[str]:
51
- """An iterable of all the valid block namespaces."""
52
- return self._spec.keys()
53
-
54
- def base_names(self, namespace: str) -> Collection[str]:
55
- """An iterable of all valid base names for the given namespace."""
56
- return self._spec[namespace].keys()
57
-
58
- def get_specification(self, namespace: str, base_name: str) -> BlockSpec:
59
- return self._spec[namespace][base_name]
60
-
61
- def translate(
62
- self,
63
- target_platform: str,
64
- target_version: VersionNumber,
65
- block: Block,
66
- block_entity: BlockEntity | None = None,
67
- extra: (
68
- tuple[
69
- BlockCoordinates,
70
- Callable[[BlockCoordinates], tuple[Block, BlockEntity | None]],
71
- ]
72
- | None
73
- ) = None,
74
- ) -> tuple[Block, BlockEntity | None, bool] | tuple[Entity, None, bool]:
75
- """Translate a block from this version to the target version specified.
76
-
77
- :param target_platform: The game platform to convert to.
78
- :param target_version: The game version number to convert to.
79
- :param block: The block to translate
80
- :param block_entity: An optional block entity related to the block input
81
- :param extra: An optional tuple containing the absolute coordinate of the block in the world and a callback
82
- function taking a relative coordinate and returning the block and block entity at that coordinate.
83
- This is required for cases where the neighbour block is required to fully define the state.
84
- If the bool in the output is True this is required to fully define the translation.
85
- :return: There are two formats that can be returned.
86
- The first is a Block, optional BlockEntity and a bool.
87
- The second is an Entity, None and a bool.
88
- The bool specifies if block_location and get_block_callback are required to fully define the output data.
89
- :raises:
90
- ValueError: The arguments are incorrect. You did something wrong.
91
- BlockTranslationError: The translator is not aware of the block. You should handle a sensible default.
92
- """
93
- target_game_version = get_game_version(target_platform, target_version)
94
- universal_block, universal_block_entity, extra_needed = self.to_universal(
95
- block, block_entity, extra
96
- )
97
- (
98
- target_obj,
99
- target_block_entity,
100
- extra_needed2,
101
- ) = target_game_version.block.from_universal(
102
- target_platform,
103
- target_version,
104
- universal_block,
105
- universal_block_entity,
106
- extra,
107
- )
108
- if isinstance(target_obj, Block):
109
- return target_obj, target_block_entity, extra_needed or extra_needed2
110
- elif isinstance(target_obj, Entity):
111
- return target_obj, None, extra_needed or extra_needed2
112
- else:
113
- raise RuntimeError
114
-
115
- @abstractmethod
116
- def to_universal(
117
- self,
118
- block: Block,
119
- block_entity: BlockEntity | None,
120
- extra: (
121
- tuple[
122
- BlockCoordinates,
123
- Callable[[BlockCoordinates], tuple[Block, BlockEntity | None]],
124
- ]
125
- | None
126
- ),
127
- ) -> tuple[Block, BlockEntity | None, bool]:
128
- """Convert a block to the universal format.
129
-
130
- This method should be considered private.
131
-
132
- :meta private:
133
- :param block: The block to translate
134
- :param block_entity: An optional block entity related to the block input
135
- :param extra: An optional tuple containing the absolute coordinate of the block in the world and a callback
136
- function taking a relative coordinate and returning the block and block entity at that coordinate.
137
- This is required for cases where the neighbour block is required to fully define the state.
138
- If the bool in the output is True this is required to fully define the translation.
139
- :return: A Block, optional BlockEntity and a bool.
140
- If the bool is True, the extra parameter is required to fully define the output data.
141
- :raises:
142
- ValueError: The arguments are incorrect. You did something wrong.
143
- BlockTranslationError: The translator is not aware of the block. You should handle a sensible default.
144
- """
145
- raise NotImplementedError
146
-
147
- @abstractmethod
148
- def from_universal(
149
- self,
150
- target_platform: str,
151
- target_version: VersionNumber,
152
- block: Block,
153
- block_entity: BlockEntity | None,
154
- extra: (
155
- tuple[
156
- BlockCoordinates,
157
- Callable[[BlockCoordinates], tuple[Block, BlockEntity | None]],
158
- ]
159
- | None
160
- ),
161
- ) -> tuple[Block, BlockEntity | None, bool] | tuple[Entity, None, bool]:
162
- """Convert a block from the universal format.
163
-
164
- This method should be considered private.
165
-
166
- :meta private:
167
- :param target_platform: The game platform to convert to.
168
- :param target_version: The game version number to convert to.
169
- :param block: The block to translate
170
- :param block_entity: An optional block entity related to the block input
171
- :param extra: An optional tuple containing the absolute coordinate of the block in the world and a callback
172
- function taking a relative coordinate and returning the block and block entity at that coordinate.
173
- This is required for cases where the neighbour block is required to fully define the state.
174
- If the bool in the output is True this is required to fully define the translation.
175
- :return: There are two formats that can be returned.
176
- Block, optional BlockEntity and a bool.
177
- Entity, None and a bool.
178
- If the bool is True, the extra parameter is required to fully define the output data.
179
- :raises:
180
- ValueError: The arguments are incorrect. You did something wrong.
181
- BlockTranslationError: The translator is not aware of the block. You should handle a sensible default.
182
- """
183
- raise NotImplementedError
184
-
185
-
186
- class DatabaseBlockData(BlockData, ABC):
187
- _to_universal: Mapping[tuple[str, str], BlockToUniversalTranslator]
188
- _from_universal: Mapping[tuple[str, str], BlockFromUniversalTranslator]
189
- _to_universal_cache: dict[Block, tuple[Block, BlockEntity | None, bool]]
190
- _from_universal_cache: dict[
191
- tuple[Block, VersionNumber],
192
- tuple[Block, BlockEntity | None, bool] | tuple[Entity, None, bool],
193
- ]
194
-
195
- def __init__(
196
- self,
197
- game_version: GameVersion,
198
- specification: Mapping[str, Mapping[str, BlockSpec]],
199
- to_universal: Mapping[tuple[str, str], BlockToUniversalTranslator],
200
- from_universal: Mapping[tuple[str, str], BlockFromUniversalTranslator],
201
- ) -> None:
202
- super().__init__(game_version, specification)
203
- self._to_universal = to_universal
204
- self._from_universal = from_universal
205
- # Cache computed results so we don't need to recompute unnecessarily.
206
- self._to_universal_cache = {}
207
- self._from_universal_cache = {}
208
-
209
- def __getstate__(self) -> dict:
210
- state = super().__getstate__()
211
- state["_to_universal"] = self._to_universal
212
- state["_from_universal"] = self._from_universal
213
- return state
214
-
215
- def __setstate__(self, state: dict) -> None:
216
- super().__setstate__(state)
217
- self._to_universal = state["_to_universal"]
218
- self._from_universal = state["_from_universal"]
219
- self._to_universal_cache = {}
220
- self._from_universal_cache = {}
221
-
222
- def to_universal(
223
- self,
224
- block: Block,
225
- block_entity: BlockEntity | None,
226
- extra: (
227
- tuple[
228
- BlockCoordinates,
229
- Callable[[BlockCoordinates], tuple[Block, BlockEntity | None]],
230
- ]
231
- | None
232
- ),
233
- ) -> tuple[Block, BlockEntity | None, bool]:
234
- if not self._game_version.supports_version(block.platform, block.version):
235
- raise ValueError("The block is not compatible with this version")
236
-
237
- if block_entity is None:
238
- if block in self._to_universal_cache:
239
- output, extra_output, extra_needed = self._to_universal_cache[block]
240
- return output, deepcopy(extra_output), extra_needed
241
- else:
242
- block_entity = deepcopy(block_entity)
243
-
244
- try:
245
- translator = self._to_universal[(block.namespace, block.base_name)]
246
- except KeyError:
247
- raise BlockTranslationError(
248
- f"Block {block} does not exist in version {self._game_version.platform} {self._game_version.min_version}"
249
- )
250
-
251
- output, extra_output, extra_needed, cacheable = translator.run(
252
- block, block_entity, extra
253
- )
254
-
255
- if cacheable:
256
- self._to_universal_cache[block] = output, extra_output, extra_needed
257
-
258
- return output, deepcopy(extra_output), extra_needed
259
-
260
- def from_universal(
261
- self,
262
- target_platform: str,
263
- target_version: VersionNumber,
264
- block: Block,
265
- block_entity: BlockEntity | None,
266
- extra: (
267
- tuple[
268
- BlockCoordinates,
269
- Callable[[BlockCoordinates], tuple[Block, BlockEntity | None]],
270
- ]
271
- | None
272
- ),
273
- ) -> tuple[Block, BlockEntity | None, bool] | tuple[Entity, None, bool]:
274
- if not self._game_version.supports_version(target_platform, target_version):
275
- raise ValueError("The target version is not compatible with this version")
276
-
277
- if block.platform != "universal":
278
- raise ValueError("The source block is not in the universal format")
279
-
280
- cache_token = (block, target_version)
281
-
282
- if block_entity is None:
283
- if cache_token in self._from_universal_cache:
284
- output, extra_output, extra_needed = self._from_universal_cache[
285
- cache_token
286
- ]
287
- if isinstance(output, Block):
288
- return output, deepcopy(extra_output), extra_needed
289
- elif isinstance(output, Entity):
290
- return deepcopy(output), None, extra_needed
291
- else:
292
- block_entity = deepcopy(block_entity)
293
-
294
- try:
295
- translator = self._from_universal[(block.namespace, block.base_name)]
296
- except KeyError:
297
- raise BlockTranslationError(
298
- f"Block {block} does not exist in version {self._game_version.platform} {self._game_version.min_version}"
299
- )
300
-
301
- output, extra_output, extra_needed, cacheable = translator.run(
302
- target_platform, target_version, block, block_entity, extra
303
- )
304
-
305
- if isinstance(output, Block):
306
- if cacheable:
307
- self._from_universal_cache[cache_token] = (
308
- output,
309
- deepcopy(extra_output),
310
- extra_needed,
311
- )
312
- return output, deepcopy(extra_output), extra_needed
313
- elif isinstance(output, Entity):
314
- if cacheable:
315
- self._from_universal_cache[cache_token] = (
316
- deepcopy(output),
317
- None,
318
- extra_needed,
319
- )
320
- return deepcopy(output), None, extra_needed
321
-
322
-
323
- class BlockDataNumericalComponent(ABC):
324
- @abstractmethod
325
- def numerical_id_to_namespace_id(self, numerical_id: int) -> tuple[str, str]:
326
- """Convert the numerical id to its namespace id"""
327
- raise NotImplementedError
328
-
329
- @abstractmethod
330
- def namespace_id_to_numerical_id(self, namespace: str, base_name: str) -> int:
331
- raise NotImplementedError
@@ -1,25 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
- from weakref import ref
5
-
6
- if TYPE_CHECKING:
7
- from .version import GameVersion
8
-
9
-
10
- class GameVersionContainer:
11
- def __init__(self, game_version: GameVersion):
12
- self.__game_version_ref = ref(game_version)
13
-
14
- @property
15
- def _game_version(self) -> GameVersion:
16
- game = self.__game_version_ref()
17
- if game is None:
18
- raise ReferenceError("Referenced GameVersion no longer exists.")
19
- return game
20
-
21
- def __getstate__(self) -> dict:
22
- return {"_game_version": self._game_version}
23
-
24
- def __setstate__(self, state: dict) -> None:
25
- self.__game_version_ref = ref(state["_game_version"])
@@ -1,27 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from typing import Self, Union, TypeAlias
5
-
6
- JSONCompatible: TypeAlias = Union[
7
- str,
8
- int,
9
- float,
10
- bool,
11
- None,
12
- "JSONList",
13
- "JSONDict",
14
- ]
15
- JSONDict: TypeAlias = dict[str, "JSONCompatible"]
16
- JSONList: TypeAlias = list["JSONCompatible"]
17
-
18
-
19
- class JSONInterface(ABC):
20
- @classmethod
21
- @abstractmethod
22
- def from_json(cls, obj: JSONCompatible) -> Self:
23
- raise NotImplementedError
24
-
25
- @abstractmethod
26
- def to_json(self) -> JSONCompatible:
27
- raise NotImplementedError
@@ -1,44 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
- from abc import ABC, abstractmethod
5
-
6
- from amulet.version import VersionNumber
7
-
8
- if TYPE_CHECKING:
9
- from .block import BlockData
10
- from .biome import BiomeData
11
-
12
-
13
- class GameVersion(ABC):
14
- @abstractmethod
15
- def supports_version(self, platform: str, version: VersionNumber) -> bool:
16
- raise NotImplementedError
17
-
18
- @property
19
- @abstractmethod
20
- def platform(self) -> str:
21
- """The platform string this instance is part of."""
22
- raise NotImplementedError
23
-
24
- @property
25
- @abstractmethod
26
- def min_version(self) -> VersionNumber:
27
- """The minimum game version this instance can be used with."""
28
- raise NotImplementedError
29
-
30
- @property
31
- @abstractmethod
32
- def max_version(self) -> VersionNumber:
33
- """The maximum game version this instance can be used with."""
34
- raise NotImplementedError
35
-
36
- @property
37
- @abstractmethod
38
- def block(self) -> BlockData:
39
- raise NotImplementedError
40
-
41
- @property
42
- @abstractmethod
43
- def biome(self) -> BiomeData:
44
- raise NotImplementedError
@@ -1 +0,0 @@
1
- from ._version import BedrockGameVersion
@@ -1,35 +0,0 @@
1
- from collections.abc import Mapping, Collection
2
-
3
- from amulet.biome import Biome
4
- from amulet.game.abc import DatabaseBiomeData, BiomeDataNumericalComponent
5
- from amulet.game.abc import GameVersion
6
-
7
-
8
- class BedrockBiomeData(DatabaseBiomeData, BiomeDataNumericalComponent):
9
- def __init__(
10
- self,
11
- game_version: GameVersion,
12
- biomes: Mapping[str, Collection[str]],
13
- to_universal: Mapping[tuple[str, str], Biome],
14
- from_universal: Mapping[Biome, tuple[str, str]],
15
- numerical_map: Mapping[int, tuple[str, str]],
16
- ):
17
- super().__init__(game_version, biomes, to_universal, from_universal)
18
- self._num_to_str = numerical_map
19
- self._str_to_num = {v: k for k, v in self._num_to_str.items()}
20
-
21
- def __getstate__(self) -> dict:
22
- state = super().__getstate__()
23
- state["_num_to_str"] = self._num_to_str
24
- return state
25
-
26
- def __setstate__(self, state: dict) -> None:
27
- super().__setstate__(state)
28
- self._num_to_str = state["_num_to_str"]
29
- self._str_to_num = {v: k for k, v in self._num_to_str.items()}
30
-
31
- def numerical_id_to_namespace_id(self, numerical_id: int) -> tuple[str, str]:
32
- return self._num_to_str[numerical_id]
33
-
34
- def namespace_id_to_numerical_id(self, namespace: str, base_name: str) -> int:
35
- return self._str_to_num[(namespace, base_name)]
@@ -1,42 +0,0 @@
1
- from collections.abc import Mapping
2
-
3
- from amulet.game.abc import (
4
- DatabaseBlockData,
5
- BlockDataNumericalComponent,
6
- GameVersion,
7
- BlockSpec,
8
- )
9
- from amulet.game.translate import (
10
- BlockToUniversalTranslator,
11
- BlockFromUniversalTranslator,
12
- )
13
-
14
-
15
- class BedrockBlockData(DatabaseBlockData, BlockDataNumericalComponent):
16
- def __init__(
17
- self,
18
- game_version: GameVersion,
19
- specification: Mapping[str, Mapping[str, BlockSpec]],
20
- to_universal: Mapping[tuple[str, str], BlockToUniversalTranslator],
21
- from_universal: Mapping[tuple[str, str], BlockFromUniversalTranslator],
22
- numerical_map: Mapping[int, tuple[str, str]],
23
- ):
24
- super().__init__(game_version, specification, to_universal, from_universal)
25
- self._num_to_str = numerical_map
26
- self._str_to_num = {v: k for k, v in self._num_to_str.items()}
27
-
28
- def __getstate__(self) -> dict:
29
- state = super().__getstate__()
30
- state["_num_to_str"] = self._num_to_str
31
- return state
32
-
33
- def __setstate__(self, state: dict) -> None:
34
- super().__setstate__(state)
35
- self._num_to_str = state["_num_to_str"]
36
- self._str_to_num = {v: k for k, v in self._num_to_str.items()}
37
-
38
- def numerical_id_to_namespace_id(self, numerical_id: int) -> tuple[str, str]:
39
- return self._num_to_str[numerical_id]
40
-
41
- def namespace_id_to_numerical_id(self, namespace: str, base_name: str) -> int:
42
- return self._str_to_num[(namespace, base_name)]
@@ -1,165 +0,0 @@
1
- from __future__ import annotations
2
- from typing import Self
3
- import json
4
- import os
5
-
6
- from amulet.biome import Biome
7
- from amulet.game import get_game_version
8
- from amulet.game.abc import GameVersion, load_json_block_spec, load_json_biome_data
9
- from amulet.game.translate import (
10
- BlockToUniversalTranslator,
11
- BlockFromUniversalTranslator,
12
- load_json_block_translations,
13
- )
14
- from amulet.version import VersionNumber
15
-
16
- from ._block import BedrockBlockData
17
- from ._biome import BedrockBiomeData
18
-
19
-
20
- class BedrockGameVersion(GameVersion):
21
- _block: BedrockBlockData
22
- _biome: BedrockBiomeData
23
-
24
- def __init__(
25
- self,
26
- min_data_version: VersionNumber,
27
- max_data_version: VersionNumber,
28
- min_semantic_version: VersionNumber,
29
- max_semantic_version: VersionNumber,
30
- ) -> None:
31
- """Do not use this."""
32
- self._min_data_version = min_data_version
33
- self._max_data_version = max_data_version
34
- self._min_semantic_version = min_semantic_version
35
- self._max_semantic_version = max_semantic_version
36
-
37
- def supports_version(self, platform: str, version: VersionNumber) -> bool:
38
- return platform == "bedrock" and (
39
- self._min_data_version <= version <= self._max_data_version
40
- or self._min_semantic_version <= version <= self._max_semantic_version
41
- )
42
-
43
- @classmethod
44
- def from_json(cls, version_path: str) -> Self:
45
- with open(os.path.join(version_path, "__init__.json")) as f:
46
- init = json.load(f)
47
- assert init["platform"] == "bedrock"
48
- min_data_version = VersionNumber(init.get("data_version", -1))
49
- max_data_version = VersionNumber(init.get("data_version_max", -1))
50
- min_semantic_version = VersionNumber(*init["version"])
51
- max_semantic_version = VersionNumber(*init["version_max"])
52
-
53
- block_format = {
54
- "numerical": "numerical",
55
- "pseudo-numerical": "numerical",
56
- "nbt-blockstate": "blockstate",
57
- }[init["block_format"]]
58
- universal_version = get_game_version("universal", VersionNumber(1))
59
-
60
- self = cls(
61
- min_data_version,
62
- max_data_version,
63
- min_semantic_version,
64
- max_semantic_version,
65
- )
66
-
67
- # Load the block specification and translations
68
- block_spec = load_json_block_spec(version_path, block_format)
69
- block_to_universal = load_json_block_translations(
70
- version_path,
71
- block_format,
72
- "to_universal",
73
- BlockToUniversalTranslator,
74
- lambda namespace, base_name: block_spec[namespace][base_name],
75
- universal_version,
76
- )
77
- block_from_universal = load_json_block_translations(
78
- version_path,
79
- block_format,
80
- "from_universal",
81
- BlockFromUniversalTranslator,
82
- universal_version.block.get_specification,
83
- self,
84
- )
85
-
86
- numerical_block_map = {}
87
- file_path = os.path.join(version_path, "__numerical_block_map__.json")
88
- if os.path.isfile(file_path):
89
- with open(file_path) as f:
90
- block_map: dict[str, int] = json.load(f)
91
- for block_str, block_num in block_map.items():
92
- namespace, base_name = block_str.split(":", 1)
93
- numerical_block_map[block_num] = (namespace, base_name)
94
-
95
- self._block = BedrockBlockData(
96
- self,
97
- block_spec,
98
- block_to_universal,
99
- block_from_universal,
100
- numerical_block_map,
101
- )
102
-
103
- biomes, to_universal, from_universal = load_json_biome_data(version_path)
104
- biome_namespace = dict[str, list[str]]()
105
- for namespace, base_name in biomes:
106
- biome_namespace.setdefault(namespace, []).append(base_name)
107
-
108
- self._biome = BedrockBiomeData(
109
- self,
110
- biome_namespace,
111
- {
112
- biome: Biome(
113
- "universal",
114
- VersionNumber(1),
115
- universal_namespace,
116
- universal_base_name,
117
- )
118
- for (
119
- biome,
120
- (universal_namespace, universal_base_name),
121
- ) in to_universal.items()
122
- },
123
- {
124
- Biome(
125
- "universal",
126
- VersionNumber(1),
127
- universal_namespace,
128
- universal_base_name,
129
- ): biome
130
- for (
131
- (universal_namespace, universal_base_name),
132
- biome,
133
- ) in from_universal.items()
134
- },
135
- {
136
- biome_id: biome
137
- for biome, biome_id in biomes.items()
138
- if biome_id is not None
139
- },
140
- )
141
-
142
- return self
143
-
144
- def __repr__(self) -> str:
145
- return f"BedrockGameVersion({self.min_version!r})"
146
-
147
- @property
148
- def platform(self) -> str:
149
- return "bedrock"
150
-
151
- @property
152
- def min_version(self) -> VersionNumber:
153
- return self._min_semantic_version
154
-
155
- @property
156
- def max_version(self) -> VersionNumber:
157
- return self._max_semantic_version
158
-
159
- @property
160
- def block(self) -> BedrockBlockData:
161
- return self._block
162
-
163
- @property
164
- def biome(self) -> BedrockBiomeData:
165
- return self._biome
@@ -1,2 +0,0 @@
1
- from ._version import JavaGameVersion
2
- from ._block import Waterloggable