amulet-core 2.0a8__cp311-cp311-win_amd64.whl → 2.0.1.0.1297307203.19.43.34808.0a0__cp311-cp311-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of amulet-core might be problematic. Click here for more details.
- amulet/core/__init__.py +36 -0
- amulet/core/__pyinstaller/hook-amulet.core.py +4 -0
- amulet/core/_amulet_core.cp311-win_amd64.pyd +0 -0
- amulet/core/_amulet_core.pyi +7 -0
- amulet/{_version.py → core/_version.py} +3 -3
- amulet/core/amulet_core.dll +0 -0
- amulet/core/amulet_core.lib +0 -0
- amulet/core/amulet_coreConfig.cmake +18 -0
- amulet/{biome.pyi → core/biome/__init__.pyi} +3 -3
- amulet/core/biome/biome.hpp +53 -0
- amulet/{block.pyi → core/block/__init__.pyi} +25 -26
- amulet/core/block/block.hpp +156 -0
- amulet/{block_entity.pyi → core/block_entity/__init__.pyi} +7 -7
- amulet/core/block_entity/block_entity.hpp +84 -0
- amulet/{errors.py → core/chunk/__init__.pyi} +37 -33
- amulet/core/chunk/chunk.hpp +126 -0
- amulet/core/chunk/component/__init__.pyi +18 -0
- amulet/core/chunk/component/biome_3d_component.hpp +96 -0
- amulet/core/chunk/component/block_component.hpp +101 -0
- amulet/core/chunk/component/block_component.pyi +28 -0
- amulet/core/chunk/component/block_entity_component.hpp +119 -0
- amulet/core/chunk/component/section_array_map.hpp +129 -0
- amulet/{chunk_components.pyi → core/chunk/component/section_array_map.pyi} +4 -24
- amulet/core/dll.hpp +21 -0
- amulet/core/entity/__init__.pyi +105 -0
- amulet/core/entity/entity.hpp +100 -0
- amulet/{palette → core/palette}/__init__.pyi +2 -2
- amulet/core/palette/biome_palette.hpp +65 -0
- amulet/{palette → core/palette}/biome_palette.pyi +8 -8
- amulet/core/palette/block_palette.hpp +71 -0
- amulet/{palette → core/palette}/block_palette.pyi +12 -10
- amulet/core/selection/__init__.pyi +8 -0
- amulet/core/selection/box.hpp +86 -0
- amulet/core/selection/box.pyi +215 -0
- amulet/core/selection/group.hpp +80 -0
- amulet/core/selection/group.pyi +213 -0
- amulet/{version.pyi → core/version/__init__.pyi} +58 -10
- amulet/core/version/version.hpp +204 -0
- {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a0.dist-info}/METADATA +25 -20
- amulet_core-2.0.1.0.1297307203.19.43.34808.0a0.dist-info/RECORD +45 -0
- {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a0.dist-info}/WHEEL +1 -1
- amulet_core-2.0.1.0.1297307203.19.43.34808.0a0.dist-info/entry_points.txt +2 -0
- amulet/__init__.cp311-win_amd64.pyd +0 -0
- amulet/__init__.py.cpp +0 -45
- amulet/__init__.pyi +0 -30
- amulet/__pyinstaller/hook-amulet.py +0 -4
- amulet/_init.py +0 -26
- amulet/biome.cpp +0 -36
- amulet/biome.hpp +0 -43
- amulet/biome.py.cpp +0 -122
- amulet/block.cpp +0 -435
- amulet/block.hpp +0 -119
- amulet/block.py.cpp +0 -377
- amulet/block_entity.cpp +0 -12
- amulet/block_entity.hpp +0 -56
- amulet/block_entity.py.cpp +0 -115
- amulet/chunk.cpp +0 -16
- amulet/chunk.hpp +0 -100
- amulet/chunk.py.cpp +0 -80
- amulet/chunk.pyi +0 -28
- amulet/chunk_components/biome_3d_component.cpp +0 -5
- amulet/chunk_components/biome_3d_component.hpp +0 -79
- amulet/chunk_components/block_component.cpp +0 -41
- amulet/chunk_components/block_component.hpp +0 -88
- amulet/chunk_components/block_entity_component.cpp +0 -5
- amulet/chunk_components/block_entity_component.hpp +0 -147
- amulet/chunk_components/section_array_map.cpp +0 -129
- amulet/chunk_components/section_array_map.hpp +0 -147
- amulet/collections/eq.py.hpp +0 -37
- amulet/collections/hash.py.hpp +0 -27
- amulet/collections/holder.py.hpp +0 -37
- amulet/collections/iterator.py.hpp +0 -80
- amulet/collections/mapping.py.hpp +0 -199
- amulet/collections/mutable_mapping.py.hpp +0 -226
- amulet/collections/sequence.py.hpp +0 -163
- amulet/collections.pyi +0 -40
- amulet/data_types.py +0 -29
- amulet/entity.py +0 -182
- amulet/game/__init__.py +0 -7
- amulet/game/_game.py +0 -152
- amulet/game/_universal/__init__.py +0 -1
- amulet/game/_universal/_biome.py +0 -17
- amulet/game/_universal/_block.py +0 -47
- amulet/game/_universal/_version.py +0 -68
- amulet/game/abc/__init__.py +0 -22
- amulet/game/abc/_block_specification.py +0 -150
- amulet/game/abc/biome.py +0 -213
- amulet/game/abc/block.py +0 -331
- amulet/game/abc/game_version_container.py +0 -25
- amulet/game/abc/json_interface.py +0 -27
- amulet/game/abc/version.py +0 -44
- amulet/game/bedrock/__init__.py +0 -1
- amulet/game/bedrock/_biome.py +0 -35
- amulet/game/bedrock/_block.py +0 -42
- amulet/game/bedrock/_version.py +0 -165
- amulet/game/java/__init__.py +0 -2
- amulet/game/java/_biome.py +0 -35
- amulet/game/java/_block.py +0 -60
- amulet/game/java/_version.py +0 -176
- amulet/game/translate/__init__.py +0 -12
- amulet/game/translate/_functions/__init__.py +0 -15
- amulet/game/translate/_functions/_code_functions/__init__.py +0 -0
- amulet/game/translate/_functions/_code_functions/_text.py +0 -553
- amulet/game/translate/_functions/_code_functions/banner_pattern.py +0 -67
- amulet/game/translate/_functions/_code_functions/bedrock_chest_connection.py +0 -152
- amulet/game/translate/_functions/_code_functions/bedrock_moving_block_pos.py +0 -88
- amulet/game/translate/_functions/_code_functions/bedrock_sign.py +0 -152
- amulet/game/translate/_functions/_code_functions/bedrock_skull_rotation.py +0 -16
- amulet/game/translate/_functions/_code_functions/custom_name.py +0 -146
- amulet/game/translate/_functions/_frozen.py +0 -66
- amulet/game/translate/_functions/_state.py +0 -54
- amulet/game/translate/_functions/_typing.py +0 -98
- amulet/game/translate/_functions/abc.py +0 -123
- amulet/game/translate/_functions/carry_nbt.py +0 -160
- amulet/game/translate/_functions/carry_properties.py +0 -80
- amulet/game/translate/_functions/code.py +0 -143
- amulet/game/translate/_functions/map_block_name.py +0 -66
- amulet/game/translate/_functions/map_nbt.py +0 -111
- amulet/game/translate/_functions/map_properties.py +0 -93
- amulet/game/translate/_functions/multiblock.py +0 -112
- amulet/game/translate/_functions/new_block.py +0 -42
- amulet/game/translate/_functions/new_entity.py +0 -43
- amulet/game/translate/_functions/new_nbt.py +0 -206
- amulet/game/translate/_functions/new_properties.py +0 -64
- amulet/game/translate/_functions/sequence.py +0 -51
- amulet/game/translate/_functions/walk_input_nbt.py +0 -331
- amulet/game/translate/_translator.py +0 -433
- amulet/img/__init__.py +0 -10
- amulet/img/missing_no.png +0 -0
- amulet/img/missing_pack.png +0 -0
- amulet/img/missing_world.png +0 -0
- amulet/io/binary_reader.hpp +0 -45
- amulet/io/binary_writer.hpp +0 -30
- amulet/item.py +0 -75
- amulet/level/__init__.pyi +0 -23
- amulet/level/_load.py +0 -100
- amulet/level/abc/__init__.py +0 -12
- amulet/level/abc/_chunk_handle.py +0 -358
- amulet/level/abc/_dimension.py +0 -86
- amulet/level/abc/_history/__init__.py +0 -1
- amulet/level/abc/_history/_cache.py +0 -224
- amulet/level/abc/_history/_history_manager.py +0 -291
- amulet/level/abc/_level/__init__.py +0 -5
- amulet/level/abc/_level/_compactable_level.py +0 -10
- amulet/level/abc/_level/_creatable_level.py +0 -28
- amulet/level/abc/_level/_disk_level.py +0 -17
- amulet/level/abc/_level/_level.py +0 -449
- amulet/level/abc/_level/_loadable_level.py +0 -42
- amulet/level/abc/_player_storage.py +0 -7
- amulet/level/abc/_raw_level.py +0 -187
- amulet/level/abc/_registry.py +0 -40
- amulet/level/java/__init__.pyi +0 -16
- amulet/level/java/_chunk_handle.py +0 -17
- amulet/level/java/_dimension.py +0 -20
- amulet/level/java/_level.py +0 -184
- amulet/level/java/_raw/__init__.pyi +0 -15
- amulet/level/java/_raw/_chunk.pyi +0 -23
- amulet/level/java/_raw/_constant.py +0 -9
- amulet/level/java/_raw/_data_pack/__init__.py +0 -2
- amulet/level/java/_raw/_data_pack/data_pack.py +0 -241
- amulet/level/java/_raw/_data_pack/data_pack_manager.py +0 -77
- amulet/level/java/_raw/_dimension.py +0 -86
- amulet/level/java/_raw/_level.py +0 -507
- amulet/level/java/_raw/_typing.py +0 -3
- amulet/level/java/_raw/java_chunk_decode.cpp +0 -531
- amulet/level/java/_raw/java_chunk_decode.hpp +0 -23
- amulet/level/java/_raw/java_chunk_encode.cpp +0 -25
- amulet/level/java/_raw/java_chunk_encode.hpp +0 -23
- amulet/level/java/anvil/__init__.py +0 -2
- amulet/level/java/anvil/_dimension.py +0 -170
- amulet/level/java/anvil/_region.py +0 -421
- amulet/level/java/anvil/_sector_manager.py +0 -223
- amulet/level/java/chunk.pyi +0 -81
- amulet/level/java/chunk_/_chunk.py +0 -260
- amulet/level/java/chunk_/components/inhabited_time.py +0 -12
- amulet/level/java/chunk_/components/last_update.py +0 -12
- amulet/level/java/chunk_/components/legacy_version.py +0 -12
- amulet/level/java/chunk_/components/light_populated.py +0 -12
- amulet/level/java/chunk_/components/named_height_2d.py +0 -37
- amulet/level/java/chunk_/components/status.py +0 -11
- amulet/level/java/chunk_/components/terrain_populated.py +0 -12
- amulet/level/java/chunk_components/data_version_component.cpp +0 -32
- amulet/level/java/chunk_components/data_version_component.hpp +0 -31
- amulet/level/java/chunk_components/java_raw_chunk_component.cpp +0 -56
- amulet/level/java/chunk_components/java_raw_chunk_component.hpp +0 -45
- amulet/level/java/chunk_components.pyi +0 -22
- amulet/level/java/java_chunk.cpp +0 -170
- amulet/level/java/java_chunk.hpp +0 -141
- amulet/level/java/long_array.hpp +0 -175
- amulet/level/java/long_array.pyi +0 -39
- amulet/level/temporary_level/__init__.py +0 -1
- amulet/level/temporary_level/_level.py +0 -16
- amulet/mesh/__init__.py +0 -0
- amulet/mesh/block/__init__.pyi +0 -301
- amulet/mesh/block/_cube.py +0 -198
- amulet/mesh/block/_missing_block.py +0 -20
- amulet/mesh/block/block_mesh.cpp +0 -107
- amulet/mesh/block/block_mesh.hpp +0 -207
- amulet/mesh/util.py +0 -17
- amulet/palette/biome_palette.hpp +0 -85
- amulet/palette/block_palette.cpp +0 -32
- amulet/palette/block_palette.hpp +0 -93
- amulet/player.py +0 -62
- amulet/pybind11/collections.hpp +0 -118
- amulet/pybind11/numpy.hpp +0 -26
- amulet/pybind11/py_module.hpp +0 -34
- amulet/pybind11/type_hints.hpp +0 -51
- amulet/pybind11/types.hpp +0 -25
- amulet/pybind11/typing.hpp +0 -7
- amulet/resource_pack/__init__.py +0 -63
- amulet/resource_pack/abc/__init__.py +0 -2
- amulet/resource_pack/abc/resource_pack.py +0 -38
- amulet/resource_pack/abc/resource_pack_manager.py +0 -85
- amulet/resource_pack/java/__init__.py +0 -2
- amulet/resource_pack/java/download_resources.py +0 -212
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
- amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
- amulet/resource_pack/java/resource_pack.py +0 -44
- amulet/resource_pack/java/resource_pack_manager.py +0 -563
- amulet/resource_pack/unknown_resource_pack.py +0 -10
- amulet/selection/__init__.py +0 -2
- amulet/selection/abstract_selection.py +0 -342
- amulet/selection/box.py +0 -852
- amulet/selection/group.py +0 -481
- amulet/utils/__init__.pyi +0 -23
- amulet/utils/call_spec/__init__.py +0 -24
- amulet/utils/call_spec/_call_spec.py +0 -257
- amulet/utils/cast.py +0 -10
- amulet/utils/comment_json.py +0 -188
- amulet/utils/format_utils.py +0 -41
- amulet/utils/generator.py +0 -18
- amulet/utils/matrix.py +0 -243
- amulet/utils/numpy.hpp +0 -36
- amulet/utils/numpy.pyi +0 -11
- amulet/utils/numpy_helpers.py +0 -19
- amulet/utils/shareable_lock.py +0 -335
- amulet/utils/signal/__init__.py +0 -10
- amulet/utils/signal/_signal.py +0 -228
- amulet/utils/task_manager.py +0 -235
- amulet/utils/typed_property.py +0 -111
- amulet/utils/weakref.py +0 -70
- amulet/utils/world_utils.py +0 -102
- amulet/version.cpp +0 -136
- amulet/version.hpp +0 -142
- amulet/version.py.cpp +0 -281
- amulet_core-2.0a8.dist-info/RECORD +0 -241
- amulet_core-2.0a8.dist-info/entry_points.txt +0 -2
- /amulet/{__pyinstaller → core/__pyinstaller}/__init__.py +0 -0
- /amulet/{py.typed → core/py.typed} +0 -0
- {amulet_core-2.0a8.dist-info → amulet_core-2.0.1.0.1297307203.19.43.34808.0a0.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
|
amulet/game/abc/version.py
DELETED
|
@@ -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
|
amulet/game/bedrock/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from ._version import BedrockGameVersion
|
amulet/game/bedrock/_biome.py
DELETED
|
@@ -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)]
|
amulet/game/bedrock/_block.py
DELETED
|
@@ -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)]
|
amulet/game/bedrock/_version.py
DELETED
|
@@ -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
|
amulet/game/java/__init__.py
DELETED