amulet-core 2.0a5__cp311-cp311-win_amd64.whl → 2.0a7__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of amulet-core might be problematic. Click here for more details.

Files changed (232) hide show
  1. amulet/__init__.cp311-win_amd64.pyd +0 -0
  2. amulet/__init__.py.cpp +43 -0
  3. amulet/__init__.pyi +0 -2
  4. amulet/_init.py +0 -2
  5. amulet/_version.py +3 -3
  6. amulet/biome.py.cpp +122 -0
  7. amulet/biome.pyi +0 -2
  8. amulet/block.py.cpp +377 -0
  9. amulet/block.pyi +0 -2
  10. amulet/block_entity.py.cpp +115 -0
  11. amulet/block_entity.pyi +0 -2
  12. amulet/chunk.py.cpp +80 -0
  13. amulet/chunk.pyi +0 -2
  14. amulet/chunk_components/biome_3d_component.cpp +5 -0
  15. amulet/chunk_components/biome_3d_component.hpp +79 -0
  16. amulet/chunk_components/block_component.cpp +41 -0
  17. amulet/chunk_components/block_component.hpp +88 -0
  18. amulet/chunk_components/block_entity_component.cpp +5 -0
  19. amulet/chunk_components/block_entity_component.hpp +147 -0
  20. amulet/chunk_components/section_array_map.cpp +129 -0
  21. amulet/chunk_components/section_array_map.hpp +147 -0
  22. amulet/chunk_components.pyi +20 -18
  23. amulet/collections/eq.py.hpp +37 -0
  24. amulet/collections/hash.py.hpp +27 -0
  25. amulet/collections/holder.py.hpp +37 -0
  26. amulet/collections/iterator.py.hpp +80 -0
  27. amulet/collections/mapping.py.hpp +199 -0
  28. amulet/collections/mutable_mapping.py.hpp +226 -0
  29. amulet/collections/sequence.py.hpp +163 -0
  30. amulet/collections.pyi +8 -5
  31. amulet/entity.py +22 -20
  32. amulet/game/translate/_functions/_code_functions/_text.py +2 -2
  33. amulet/game/translate/_functions/abc.py +10 -3
  34. amulet/img/__init__.py +10 -0
  35. amulet/img/missing_no.png +0 -0
  36. amulet/img/missing_pack.png +0 -0
  37. amulet/img/missing_world.png +0 -0
  38. amulet/io/binary_reader.hpp +45 -0
  39. amulet/io/binary_writer.hpp +30 -0
  40. amulet/level/__init__.pyi +2 -6
  41. amulet/level/abc/_level/_creatable_level.py +1 -2
  42. amulet/level/abc/_level/_level.py +1 -5
  43. amulet/level/java/__init__.pyi +0 -5
  44. amulet/level/java/_raw/__init__.pyi +0 -4
  45. amulet/level/java/_raw/java_chunk_decode.cpp +531 -0
  46. amulet/level/java/_raw/java_chunk_decode.hpp +23 -0
  47. amulet/level/java/_raw/java_chunk_encode.cpp +25 -0
  48. amulet/level/java/_raw/java_chunk_encode.hpp +23 -0
  49. amulet/level/java/chunk_components/data_version_component.cpp +32 -0
  50. amulet/level/java/chunk_components/data_version_component.hpp +31 -0
  51. amulet/level/java/chunk_components/java_raw_chunk_component.cpp +56 -0
  52. amulet/level/java/chunk_components/java_raw_chunk_component.hpp +45 -0
  53. amulet/level/java/java_chunk.cpp +170 -0
  54. amulet/level/java/java_chunk.hpp +141 -0
  55. amulet/level/java/long_array.hpp +175 -0
  56. amulet/level/java/long_array.pyi +2 -1
  57. amulet/mesh/block/__init__.py +1 -0
  58. amulet/mesh/block/block_mesh.py +369 -0
  59. amulet/mesh/block/cube.py +149 -0
  60. amulet/mesh/block/missing_block.py +20 -0
  61. amulet/mesh/util.py +17 -0
  62. amulet/palette/biome_palette.hpp +85 -0
  63. amulet/palette/block_palette.cpp +32 -0
  64. amulet/palette/block_palette.hpp +93 -0
  65. amulet/player.py +4 -6
  66. amulet/pybind11/collections.hpp +118 -0
  67. amulet/pybind11/numpy.hpp +26 -0
  68. amulet/pybind11/py_module.hpp +34 -0
  69. amulet/pybind11/type_hints.hpp +51 -0
  70. amulet/pybind11/types.hpp +25 -0
  71. amulet/pybind11/typing.hpp +7 -0
  72. amulet/resource_pack/__init__.py +62 -0
  73. amulet/resource_pack/abc/__init__.py +2 -0
  74. amulet/resource_pack/abc/resource_pack.py +38 -0
  75. amulet/resource_pack/abc/resource_pack_manager.py +87 -0
  76. amulet/resource_pack/bedrock/__init__.py +2 -0
  77. amulet/resource_pack/bedrock/bedrock_vanilla_fix/pack_icon.png +0 -0
  78. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_carried.png +0 -0
  79. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_side_carried.png +0 -0
  80. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/water.png +0 -0
  81. amulet/resource_pack/bedrock/blockshapes/__init__.py +31 -0
  82. amulet/resource_pack/bedrock/blockshapes/air.py +35 -0
  83. amulet/resource_pack/bedrock/blockshapes/base_blockshape.py +29 -0
  84. amulet/resource_pack/bedrock/blockshapes/bubble_column.py +29 -0
  85. amulet/resource_pack/bedrock/blockshapes/cake.py +46 -0
  86. amulet/resource_pack/bedrock/blockshapes/chest.py +54 -0
  87. amulet/resource_pack/bedrock/blockshapes/comparator.py +51 -0
  88. amulet/resource_pack/bedrock/blockshapes/cross_texture.py +186 -0
  89. amulet/resource_pack/bedrock/blockshapes/cross_texture0.py +17 -0
  90. amulet/resource_pack/bedrock/blockshapes/cross_texture_green.py +16 -0
  91. amulet/resource_pack/bedrock/blockshapes/cube.py +38 -0
  92. amulet/resource_pack/bedrock/blockshapes/default.py +14 -0
  93. amulet/resource_pack/bedrock/blockshapes/door.py +38 -0
  94. amulet/resource_pack/bedrock/blockshapes/door1.py +14 -0
  95. amulet/resource_pack/bedrock/blockshapes/door2.py +14 -0
  96. amulet/resource_pack/bedrock/blockshapes/door3.py +14 -0
  97. amulet/resource_pack/bedrock/blockshapes/door4.py +14 -0
  98. amulet/resource_pack/bedrock/blockshapes/door5.py +14 -0
  99. amulet/resource_pack/bedrock/blockshapes/door6.py +14 -0
  100. amulet/resource_pack/bedrock/blockshapes/double_plant.py +40 -0
  101. amulet/resource_pack/bedrock/blockshapes/enchanting_table.py +22 -0
  102. amulet/resource_pack/bedrock/blockshapes/farmland.py +22 -0
  103. amulet/resource_pack/bedrock/blockshapes/fence.py +22 -0
  104. amulet/resource_pack/bedrock/blockshapes/flat.py +55 -0
  105. amulet/resource_pack/bedrock/blockshapes/flat_wall.py +55 -0
  106. amulet/resource_pack/bedrock/blockshapes/furnace.py +44 -0
  107. amulet/resource_pack/bedrock/blockshapes/furnace_lit.py +14 -0
  108. amulet/resource_pack/bedrock/blockshapes/green_cube.py +39 -0
  109. amulet/resource_pack/bedrock/blockshapes/ladder.py +36 -0
  110. amulet/resource_pack/bedrock/blockshapes/lilypad.py +14 -0
  111. amulet/resource_pack/bedrock/blockshapes/partial_block.py +57 -0
  112. amulet/resource_pack/bedrock/blockshapes/piston.py +44 -0
  113. amulet/resource_pack/bedrock/blockshapes/piston_arm.py +72 -0
  114. amulet/resource_pack/bedrock/blockshapes/portal_frame.py +22 -0
  115. amulet/resource_pack/bedrock/blockshapes/pressure_plate.py +29 -0
  116. amulet/resource_pack/bedrock/blockshapes/pumpkin.py +36 -0
  117. amulet/resource_pack/bedrock/blockshapes/pumpkin_carved.py +14 -0
  118. amulet/resource_pack/bedrock/blockshapes/pumpkin_lit.py +14 -0
  119. amulet/resource_pack/bedrock/blockshapes/red_dust.py +14 -0
  120. amulet/resource_pack/bedrock/blockshapes/repeater.py +53 -0
  121. amulet/resource_pack/bedrock/blockshapes/slab.py +33 -0
  122. amulet/resource_pack/bedrock/blockshapes/slab_double.py +15 -0
  123. amulet/resource_pack/bedrock/blockshapes/tree.py +41 -0
  124. amulet/resource_pack/bedrock/blockshapes/turtle_egg.py +15 -0
  125. amulet/resource_pack/bedrock/blockshapes/vine.py +52 -0
  126. amulet/resource_pack/bedrock/blockshapes/wall.py +22 -0
  127. amulet/resource_pack/bedrock/blockshapes/water.py +38 -0
  128. amulet/resource_pack/bedrock/download_resources.py +147 -0
  129. amulet/resource_pack/bedrock/resource_pack.py +40 -0
  130. amulet/resource_pack/bedrock/resource_pack_manager.py +361 -0
  131. amulet/resource_pack/bedrock/sort_blockshapes.py +15 -0
  132. amulet/resource_pack/java/__init__.py +2 -0
  133. amulet/resource_pack/java/download_resources.py +212 -0
  134. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
  135. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
  136. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
  137. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
  138. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
  139. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
  140. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
  141. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
  142. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
  143. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
  144. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
  145. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
  146. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
  147. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
  148. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
  149. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
  150. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
  151. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
  152. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
  153. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
  154. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
  155. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
  156. amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
  157. amulet/resource_pack/java/resource_pack.py +44 -0
  158. amulet/resource_pack/java/resource_pack_manager.py +551 -0
  159. amulet/resource_pack/unknown_resource_pack.py +10 -0
  160. amulet/utils/__init__.pyi +0 -5
  161. amulet/utils/call_spec/_call_spec.py +2 -7
  162. amulet/utils/comment_json.py +188 -0
  163. amulet/utils/matrix.py +3 -3
  164. amulet/utils/numpy.hpp +36 -0
  165. amulet/utils/numpy_helpers.py +2 -2
  166. amulet/utils/world_utils.py +2 -2
  167. amulet/version.py.cpp +281 -0
  168. amulet/version.pyi +0 -8
  169. {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/METADATA +3 -3
  170. amulet_core-2.0a7.dist-info/RECORD +295 -0
  171. amulet/chunk_/components/biome.py +0 -155
  172. amulet/chunk_/components/block_entity.py +0 -117
  173. amulet/chunk_/components/entity.py +0 -64
  174. amulet/chunk_/components/height_2d.py +0 -16
  175. amulet/level/bedrock/__init__.py +0 -2
  176. amulet/level/bedrock/_chunk_handle.py +0 -19
  177. amulet/level/bedrock/_dimension.py +0 -22
  178. amulet/level/bedrock/_level.py +0 -187
  179. amulet/level/bedrock/_raw/__init__.py +0 -5
  180. amulet/level/bedrock/_raw/_actor_counter.py +0 -53
  181. amulet/level/bedrock/_raw/_chunk.py +0 -54
  182. amulet/level/bedrock/_raw/_chunk_decode.py +0 -668
  183. amulet/level/bedrock/_raw/_chunk_encode.py +0 -602
  184. amulet/level/bedrock/_raw/_constant.py +0 -9
  185. amulet/level/bedrock/_raw/_dimension.py +0 -343
  186. amulet/level/bedrock/_raw/_level.py +0 -463
  187. amulet/level/bedrock/_raw/_level_dat.py +0 -90
  188. amulet/level/bedrock/_raw/_typing.py +0 -6
  189. amulet/level/bedrock/_raw/leveldb_chunk_versions.py +0 -83
  190. amulet/level/bedrock/chunk/__init__.py +0 -1
  191. amulet/level/bedrock/chunk/_chunk.py +0 -126
  192. amulet/level/bedrock/chunk/components/chunk_version.py +0 -12
  193. amulet/level/bedrock/chunk/components/finalised_state.py +0 -13
  194. amulet/level/bedrock/chunk/components/raw_chunk.py +0 -15
  195. amulet/level/construction/__init__.py +0 -0
  196. amulet/level/java/_chunk_handle.pyi +0 -15
  197. amulet/level/java/_dimension.pyi +0 -13
  198. amulet/level/java/_level.pyi +0 -120
  199. amulet/level/java/_raw/_chunk_decode.py +0 -561
  200. amulet/level/java/_raw/_chunk_encode.py +0 -463
  201. amulet/level/java/_raw/_constant.pyi +0 -20
  202. amulet/level/java/_raw/_data_pack/__init__.pyi +0 -8
  203. amulet/level/java/_raw/_data_pack/data_pack.pyi +0 -197
  204. amulet/level/java/_raw/_data_pack/data_pack_manager.pyi +0 -75
  205. amulet/level/java/_raw/_dimension.pyi +0 -72
  206. amulet/level/java/_raw/_level.pyi +0 -238
  207. amulet/level/java/_raw/_typing.pyi +0 -5
  208. amulet/level/java/anvil/__init__.pyi +0 -11
  209. amulet/level/java/anvil/_dimension.pyi +0 -109
  210. amulet/level/java/anvil/_region.pyi +0 -197
  211. amulet/level/java/anvil/_sector_manager.pyi +0 -142
  212. amulet/level/java_forge/__init__.py +0 -0
  213. amulet/level/mcstructure/__init__.py +0 -0
  214. amulet/level/nbt/__init__.py +0 -0
  215. amulet/level/schematic/__init__.py +0 -0
  216. amulet/level/sponge_schematic/__init__.py +0 -0
  217. amulet/utils/call_spec/__init__.pyi +0 -53
  218. amulet/utils/call_spec/_call_spec.pyi +0 -272
  219. amulet/utils/matrix.pyi +0 -177
  220. amulet/utils/shareable_lock.pyi +0 -190
  221. amulet/utils/signal/__init__.pyi +0 -25
  222. amulet/utils/signal/_signal.pyi +0 -84
  223. amulet/utils/task_manager.pyi +0 -168
  224. amulet/utils/typing.py +0 -4
  225. amulet/utils/typing.pyi +0 -6
  226. amulet/utils/weakref.pyi +0 -50
  227. amulet/utils/world_utils.pyi +0 -109
  228. amulet_core-2.0a5.dist-info/RECORD +0 -210
  229. /amulet/{level/bedrock/chunk/components → mesh}/__init__.py +0 -0
  230. {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/WHEEL +0 -0
  231. {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/entry_points.txt +0 -0
  232. {amulet_core-2.0a5.dist-info → amulet_core-2.0a7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,56 @@
1
+ #include <optional>
2
+ #include <stdexcept>
3
+
4
+ #include <amulet/io/binary_writer.hpp>
5
+ #include <amulet/io/binary_reader.hpp>
6
+
7
+ #include <amulet_nbt/nbt_encoding/binary.hpp>
8
+
9
+ #include <amulet/level/java/chunk_components/java_raw_chunk_component.hpp>
10
+
11
+ namespace Amulet {
12
+ const std::string JavaRawChunkComponent::ComponentID = "Amulet::JavaRawChunkComponent";
13
+
14
+ std::optional<std::string> JavaRawChunkComponent::serialise() const {
15
+ if (_raw_data) {
16
+ BinaryWriter writer;
17
+ writer.writeNumeric<std::uint8_t>(1);
18
+ const auto& raw_data = _raw_data.value();
19
+ writer.writeNumeric<std::uint64_t>(raw_data->size());
20
+ for (const auto& [k, v] : *raw_data) {
21
+ writer.writeSizeAndBytes(k);
22
+ AmuletNBT::write_nbt(writer, *v);
23
+ }
24
+ return writer.getBuffer();
25
+ }
26
+ else {
27
+ return std::nullopt;
28
+ }
29
+ }
30
+ void JavaRawChunkComponent::deserialise(std::optional<std::string> data) {
31
+ if (data) {
32
+ size_t position = 0;
33
+ BinaryReader reader(data.value(), position);
34
+ auto version = reader.readNumeric<std::uint8_t>();
35
+ switch (version) {
36
+ case 1:
37
+ {
38
+ auto raw_data = std::make_shared<Amulet::JavaRawChunkType>();
39
+ auto count = reader.readNumeric<std::uint64_t>();
40
+ for (auto i = 0; i < count; i++) {
41
+ auto key = reader.readSizeAndBytes();
42
+ auto tag = std::make_shared<AmuletNBT::NamedTag>(AmuletNBT::read_nbt(reader));
43
+ raw_data->emplace(key, tag);
44
+ }
45
+ _raw_data = raw_data;
46
+ }
47
+ break;
48
+ default:
49
+ throw std::invalid_argument("Unsupported JavaRawChunkComponent version " + std::to_string(version));
50
+ }
51
+ }
52
+ else {
53
+ _raw_data = std::nullopt;
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,45 @@
1
+ #pragma once
2
+
3
+ #include <optional>
4
+ #include <cstdint>
5
+ #include <string>
6
+ #include <stdexcept>
7
+ #include <memory>
8
+ #include <map>
9
+ #include <amulet_nbt/tag/named_tag.hpp>
10
+
11
+
12
+ namespace Amulet {
13
+ typedef std::map<std::string, std::shared_ptr<AmuletNBT::NamedTag>> JavaRawChunkType;
14
+
15
+ class JavaRawChunkComponent {
16
+ private:
17
+ std::optional<std::shared_ptr<JavaRawChunkType>> _raw_data;
18
+ protected:
19
+ // Null constructor
20
+ JavaRawChunkComponent() {};
21
+ // Default constructor
22
+ void init(std::shared_ptr<JavaRawChunkType> raw_data) { _raw_data = raw_data; }
23
+ void init() { _raw_data = std::make_shared<JavaRawChunkType>(); }
24
+ // Serialise the component data
25
+ std::optional<std::string> serialise() const;
26
+ // Deserialise the component
27
+ void deserialise(std::optional<std::string>);
28
+ public:
29
+ static const std::string ComponentID;
30
+ std::shared_ptr<JavaRawChunkType> get_raw_data() {
31
+ if (_raw_data) {
32
+ return *_raw_data;
33
+ }
34
+ throw std::runtime_error("JavaRawChunkComponent has not been loaded.");
35
+ };
36
+ void set_raw_data(std::shared_ptr<JavaRawChunkType> raw_data) {
37
+ if (_raw_data) {
38
+ _raw_data = raw_data;
39
+ }
40
+ else {
41
+ throw std::runtime_error("JavaRawChunkComponent has not been loaded.");
42
+ }
43
+ }
44
+ };
45
+ }
@@ -0,0 +1,170 @@
1
+ #include <string>
2
+ #include <optional>
3
+ #include <vector>
4
+ #include <unordered_map>
5
+ #include <cstdint>
6
+
7
+ #include <amulet/chunk.hpp>
8
+ #include <amulet/level/java/java_chunk.hpp>
9
+ #include <amulet/chunk_components/block_component.hpp>
10
+
11
+ namespace Amulet {
12
+ const std::string JavaChunkNA::ChunkID = "Amulet::JavaChunkNA";
13
+ const std::string JavaChunk0::ChunkID = "Amulet::JavaChunk0";
14
+ const std::string JavaChunk1444::ChunkID = "Amulet::JavaChunk1444";
15
+ const std::string JavaChunk1466::ChunkID = "Amulet::JavaChunk1466";
16
+ const std::string JavaChunk2203::ChunkID = "Amulet::JavaChunk2203";
17
+
18
+ std::string JavaChunkNA::get_chunk_id() const { return ChunkID; }
19
+ std::string JavaChunk0::get_chunk_id() const { return ChunkID; }
20
+ std::string JavaChunk1444::get_chunk_id() const { return ChunkID; }
21
+ std::string JavaChunk1466::get_chunk_id() const { return ChunkID; }
22
+ std::string JavaChunk2203::get_chunk_id() const { return ChunkID; }
23
+
24
+ JavaChunkNA::JavaChunkNA(
25
+ std::shared_ptr<BlockStack> default_block,
26
+ std::shared_ptr<Biome> default_biome
27
+ ) : ChunkComponentHelper() {
28
+ auto version_number = std::make_shared<VersionNumber>(
29
+ std::initializer_list<std::int64_t>{ -1 }
30
+ );
31
+ auto version_range = std::make_shared<VersionRange>(
32
+ "java",
33
+ version_number,
34
+ version_number
35
+ );
36
+ JavaRawChunkComponent::init();
37
+ DataVersionComponent::init(-1);
38
+ BlockComponent::init(
39
+ version_range,
40
+ SectionShape(
41
+ static_cast<std::uint16_t>(16),
42
+ static_cast<std::uint16_t>(16),
43
+ static_cast<std::uint16_t>(16)
44
+ ),
45
+ default_block
46
+ );
47
+ }
48
+
49
+ JavaChunk0::JavaChunk0(
50
+ std::int64_t data_version,
51
+ std::shared_ptr<BlockStack> default_block,
52
+ std::shared_ptr<Biome> default_biome
53
+ ) : ChunkComponentHelper() {
54
+ if (data_version < 0 || 1443 < data_version) {
55
+ throw std::invalid_argument("data version must be between 0 and 1443");
56
+ }
57
+ auto version_number = std::make_shared<VersionNumber>(
58
+ std::initializer_list<std::int64_t>{ data_version }
59
+ );
60
+ auto version_range = std::make_shared<VersionRange>(
61
+ "java",
62
+ version_number,
63
+ version_number
64
+ );
65
+ JavaRawChunkComponent::init();
66
+ DataVersionComponent::init(data_version);
67
+ BlockComponent::init(
68
+ version_range,
69
+ SectionShape(
70
+ static_cast<std::uint16_t>(16),
71
+ static_cast<std::uint16_t>(16),
72
+ static_cast<std::uint16_t>(16)
73
+ ),
74
+ default_block
75
+ );
76
+ }
77
+
78
+ JavaChunk1444::JavaChunk1444(
79
+ std::int64_t data_version,
80
+ std::shared_ptr<BlockStack> default_block,
81
+ std::shared_ptr<Biome> default_biome
82
+ ) : ChunkComponentHelper() {
83
+ if (data_version < 1444 || 1465 < data_version) {
84
+ throw std::invalid_argument("data version must be between 1443 and 1465");
85
+ }
86
+ auto version_number = std::make_shared<VersionNumber>(
87
+ std::initializer_list<std::int64_t>{ data_version }
88
+ );
89
+ auto version_range = std::make_shared<VersionRange>(
90
+ "java",
91
+ version_number,
92
+ version_number
93
+ );
94
+ JavaRawChunkComponent::init();
95
+ DataVersionComponent::init(data_version);
96
+ BlockComponent::init(
97
+ version_range,
98
+ SectionShape(
99
+ static_cast<std::uint16_t>(16),
100
+ static_cast<std::uint16_t>(16),
101
+ static_cast<std::uint16_t>(16)
102
+ ),
103
+ default_block
104
+ );
105
+ }
106
+
107
+ JavaChunk1466::JavaChunk1466(
108
+ std::int64_t data_version,
109
+ std::shared_ptr<BlockStack> default_block,
110
+ std::shared_ptr<Biome> default_biome
111
+ ) : ChunkComponentHelper() {
112
+ if (data_version < 1466 || 2202 < data_version) {
113
+ throw std::invalid_argument("data version must be between 1466 and 2202");
114
+ }
115
+ auto version_number = std::make_shared<VersionNumber>(
116
+ std::initializer_list<std::int64_t>{ data_version }
117
+ );
118
+ auto version_range = std::make_shared<VersionRange>(
119
+ "java",
120
+ version_number,
121
+ version_number
122
+ );
123
+ JavaRawChunkComponent::init();
124
+ DataVersionComponent::init(data_version);
125
+ BlockComponent::init(
126
+ version_range,
127
+ SectionShape(
128
+ static_cast<std::uint16_t>(16),
129
+ static_cast<std::uint16_t>(16),
130
+ static_cast<std::uint16_t>(16)
131
+ ),
132
+ default_block
133
+ );
134
+ }
135
+
136
+ JavaChunk2203::JavaChunk2203(
137
+ std::int64_t data_version,
138
+ std::shared_ptr<BlockStack> default_block,
139
+ std::shared_ptr<Biome> default_biome
140
+ ) : ChunkComponentHelper() {
141
+ if (data_version < 2203) {
142
+ throw std::invalid_argument("data version must be at least 2203");
143
+ }
144
+ auto version_number = std::make_shared<VersionNumber>(
145
+ std::initializer_list<std::int64_t>{ data_version }
146
+ );
147
+ auto version_range = std::make_shared<VersionRange>(
148
+ "java",
149
+ version_number,
150
+ version_number
151
+ );
152
+ JavaRawChunkComponent::init();
153
+ DataVersionComponent::init(data_version);
154
+ BlockComponent::init(
155
+ version_range,
156
+ SectionShape(
157
+ static_cast<std::uint16_t>(16),
158
+ static_cast<std::uint16_t>(16),
159
+ static_cast<std::uint16_t>(16)
160
+ ),
161
+ default_block
162
+ );
163
+ }
164
+
165
+ static const ChunkNullConstructor<JavaChunkNA> _jcna;
166
+ static const ChunkNullConstructor<JavaChunk0> _jc0;
167
+ static const ChunkNullConstructor<JavaChunk1444> _jc1444;
168
+ static const ChunkNullConstructor<JavaChunk1466> _jc1466;
169
+ static const ChunkNullConstructor<JavaChunk2203> _jc2203;
170
+ }
@@ -0,0 +1,141 @@
1
+ #pragma once
2
+
3
+ #include <string>
4
+ #include <optional>
5
+ #include <stdexcept>
6
+ #include <vector>
7
+ #include <amulet/block.hpp>
8
+ #include <amulet/biome.hpp>
9
+ #include <amulet/chunk.hpp>
10
+ #include <amulet/chunk_components/block_component.hpp>
11
+ #include "chunk_components/java_raw_chunk_component.hpp"
12
+ #include "chunk_components/data_version_component.hpp"
13
+
14
+ namespace Amulet {
15
+ class JavaChunk : public Chunk {};
16
+
17
+ class JavaChunkNA : public ChunkComponentHelper<
18
+ JavaChunk,
19
+ JavaRawChunkComponent,
20
+ DataVersionComponent,
21
+ // LastUpdateComponent,
22
+ // JavaLegacyVersionComponent,
23
+ BlockComponent//,
24
+ // BlockEntityComponent,
25
+ // EntityComponent,
26
+ // Biome2DComponent,
27
+ // Height2DComponent,
28
+ > {
29
+ public:
30
+ static const std::string ChunkID;
31
+
32
+ std::string get_chunk_id() const override;
33
+
34
+ using ChunkComponentHelper::ChunkComponentHelper;
35
+ JavaChunkNA(
36
+ std::shared_ptr<BlockStack> default_block,
37
+ std::shared_ptr<Biome> default_biome
38
+ );
39
+ };
40
+
41
+ class JavaChunk0 : public ChunkComponentHelper<
42
+ JavaChunk,
43
+ JavaRawChunkComponent,
44
+ DataVersionComponent,
45
+ // LastUpdateComponent,
46
+ // TerrainPopulatedComponent,
47
+ // LightPopulatedComponent,
48
+ BlockComponent//,
49
+ // BlockEntityComponent,
50
+ // EntityComponent,
51
+ // Biome2DComponent,
52
+ // Height2DComponent,
53
+ > {
54
+ public:
55
+ static const std::string ChunkID;
56
+
57
+ std::string get_chunk_id() const override;
58
+
59
+ using ChunkComponentHelper::ChunkComponentHelper;
60
+ JavaChunk0(
61
+ std::int64_t data_version,
62
+ std::shared_ptr<BlockStack> default_block,
63
+ std::shared_ptr<Biome> default_biome
64
+ );
65
+ };
66
+
67
+ class JavaChunk1444 : public ChunkComponentHelper<
68
+ JavaChunk,
69
+ JavaRawChunkComponent,
70
+ DataVersionComponent,
71
+ // LastUpdateComponent,
72
+ // StatusStringComponent,
73
+ BlockComponent//,
74
+ // BlockEntityComponent,
75
+ // EntityComponent,
76
+ // Biome2DComponent,
77
+ // Height2DComponent,
78
+ > {
79
+ public:
80
+ static const std::string ChunkID;
81
+
82
+ std::string get_chunk_id() const override;
83
+
84
+ using ChunkComponentHelper::ChunkComponentHelper;
85
+ JavaChunk1444(
86
+ std::int64_t data_version,
87
+ std::shared_ptr<BlockStack> default_block,
88
+ std::shared_ptr<Biome> default_biome
89
+ );
90
+ };
91
+
92
+ class JavaChunk1466 : public ChunkComponentHelper<
93
+ JavaChunk,
94
+ JavaRawChunkComponent,
95
+ DataVersionComponent,
96
+ // LastUpdateComponent,
97
+ // StatusStringComponent,
98
+ BlockComponent//,
99
+ // BlockEntityComponent,
100
+ // EntityComponent,
101
+ // Biome2DComponent,
102
+ // NamedHeight2DComponent,
103
+ > {
104
+ public:
105
+ static const std::string ChunkID;
106
+
107
+ std::string get_chunk_id() const override;
108
+
109
+ using ChunkComponentHelper::ChunkComponentHelper;
110
+ JavaChunk1466(
111
+ std::int64_t data_version,
112
+ std::shared_ptr<BlockStack> default_block,
113
+ std::shared_ptr<Biome> default_biome
114
+ );
115
+ };
116
+
117
+ class JavaChunk2203 : public ChunkComponentHelper<
118
+ JavaChunk,
119
+ JavaRawChunkComponent,
120
+ DataVersionComponent,
121
+ // LastUpdateComponent,
122
+ // StatusStringComponent,
123
+ BlockComponent//,
124
+ // BlockEntityComponent,
125
+ // EntityComponent,
126
+ // Biome3DComponent,
127
+ // NamedHeight2DComponent,
128
+ > {
129
+ public:
130
+ static const std::string ChunkID;
131
+
132
+ std::string get_chunk_id() const override;
133
+
134
+ using ChunkComponentHelper::ChunkComponentHelper;
135
+ JavaChunk2203(
136
+ std::int64_t data_version,
137
+ std::shared_ptr<BlockStack> default_block,
138
+ std::shared_ptr<Biome> default_biome
139
+ );
140
+ };
141
+ }
@@ -0,0 +1,175 @@
1
+ #pragma once
2
+ #include <span>
3
+ #include <cstdint>
4
+ #include <stdexcept>
5
+ #include <string>
6
+ #include <cmath>
7
+ #include <algorithm>
8
+ #include <bit>
9
+ #include <type_traits>
10
+
11
+ namespace Amulet {
12
+ /*
13
+ Minecraft Java edition stores the block and height arrays in a compacted long array format.
14
+ The format stores one or more entries per long, using the fewest number of bits required to store the data.
15
+ There are two storage methods, the compact version was used prior to 1.16 and the less compact version in 1.16 and above.
16
+ Apparently the less compact version is quicker to pack and unpack.
17
+ The compact version effectively stores the values as a bit array spanning one or more values in the long array.
18
+ There may be some padding if the bit array does not fill all the long values. (The letter "P" signifies an unused padding bit)
19
+ HGGGGGGGGGFFFFFFFFFEEEEEEEEEDDDDDDDDDCCCCCCCCCBBBBBBBBBAAAAAAAAA PPNNNNNNNNNMMMMMMMMMLLLLLLLLLKKKKKKKKKJJJJJJJJJIIIIIIIIIHHHHHHHH
20
+ The less compact version does not allow entries to straddle long values. Instead, if required, there is padding within each long.
21
+ PGGGGGGGGGFFFFFFFFFEEEEEEEEEDDDDDDDDDCCCCCCCCCBBBBBBBBBAAAAAAAAA PNNNNNNNNNMMMMMMMMMLLLLLLLLLKKKKKKKKKJJJJJJJJJIIIIIIIIIHHHHHHHHH
22
+ */
23
+
24
+ template <typename decodedT>
25
+ void decode_long_array(
26
+ const std::span<std::uint64_t>& encoded, // The long array to decode
27
+ std::span<decodedT>& decoded, // The array to unpack values into
28
+ std::uint8_t bits_per_entry, // The number of bits per entry
29
+ bool dense = true
30
+ ) {
31
+ static_assert(std::is_unsigned_v<decodedT>, "decodedT must be unsigned");
32
+ if (bits_per_entry < 1 || 64 < bits_per_entry) {
33
+ throw std::invalid_argument("bits_per_entry must be between 1 and 64 inclusive. Got " + std::to_string(bits_per_entry));
34
+ }
35
+
36
+ size_t expected_len = std::ceil(
37
+ dense ? static_cast<float>(decoded.size()) * bits_per_entry / 64 : static_cast<float>(decoded.size()) / (64 / bits_per_entry)
38
+ );
39
+
40
+ if (encoded.size() != expected_len) {
41
+ throw std::invalid_argument(
42
+ dense ? "Dense encoded long array with " : "Encoded long array with " +
43
+ std::to_string(bits_per_entry) +
44
+ " bits per entry should contain " +
45
+ std::to_string(expected_len) +
46
+ " longs but got " +
47
+ std::to_string(encoded.size()) +
48
+ "."
49
+ );
50
+ }
51
+
52
+ const std::uint64_t mask = ~0ull >> (64 - bits_per_entry);
53
+ if (dense) {
54
+ for (size_t decoded_index = 0; decoded_index < decoded.size(); decoded_index++) {
55
+ size_t bit_start = decoded_index * bits_per_entry;
56
+ size_t bit_stop = (decoded_index + 1) * bits_per_entry;
57
+ size_t long_start = bit_start / 64;
58
+ decodedT& value = decoded[decoded_index];
59
+ value = (encoded[long_start] >> (bit_start % 64)) & mask;
60
+ if ((long_start + 1) * 64 < bit_stop) {
61
+ // Overflows into the next long
62
+ size_t overflow_bits = bit_stop - (long_start + 1) * 64;
63
+ size_t previous_bits = bits_per_entry - overflow_bits;
64
+ value |= (encoded[long_start + 1] & (mask >> previous_bits)) << previous_bits;
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ size_t entries_per_long = 64 / bits_per_entry;
70
+ size_t decoded_index = 0;
71
+ for (const auto& encoded_value : encoded) {
72
+ for (
73
+ size_t offset = 0;
74
+ offset < entries_per_long && decoded_index < decoded.size();
75
+ offset++, decoded_index++
76
+ ) {
77
+ decoded[decoded_index] = (encoded_value >> (bits_per_entry * offset)) & mask;
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ // Get the number of longs required to store the encoded long array.
84
+ inline size_t encoded_long_array_size(
85
+ size_t decoded_size, // The number of elements to encode
86
+ std::uint8_t bits_per_entry, // The number of bits of each number to use
87
+ bool dense = true
88
+ ) {
89
+ if (dense) {
90
+ return std::ceil(static_cast<float>(decoded_size * bits_per_entry) / 64);
91
+ }
92
+ else {
93
+ size_t entries_per_long = 64 / bits_per_entry;
94
+ return std::ceil(static_cast<float>(decoded_size) / entries_per_long);
95
+ }
96
+ }
97
+
98
+ // Encode the array to a long array with the specified number of bits. Extra bits are ignored.
99
+ template <typename decodedT>
100
+ void encode_long_array(
101
+ const std::span<decodedT>& decoded, // The array to encode
102
+ std::span<std::uint64_t> encoded, // The array to encode into. This must be large enough.
103
+ std::uint8_t bits_per_entry, // The number of bits of each number to use
104
+ bool dense = true
105
+ ) {
106
+ static_assert(std::is_unsigned_v<decodedT>, "decodedT must be unsigned");
107
+ if (bits_per_entry < 1 || 64 < bits_per_entry) {
108
+ throw std::invalid_argument("bits_per_entry must be between 1 and 64 inclusive. Got " + std::to_string(bits_per_entry));
109
+ }
110
+
111
+ // Set all values to 0
112
+ std::fill(encoded.begin(), encoded.end(), 0);
113
+ const std::uint64_t mask = ~0ull >> (64 - bits_per_entry);
114
+ if (dense) {
115
+ for (size_t decoded_index = 0; decoded_index < decoded.size(); decoded_index++) {
116
+ // The bit in the array where the value starts
117
+ size_t bit_start = decoded_index * bits_per_entry;
118
+ // The bit in the array where the value stops
119
+ size_t bit_stop = bit_start + bits_per_entry;
120
+ // The long number that the value starts in
121
+ size_t long_start = bit_start / 64;
122
+ // The bit offset in the long where the value starts
123
+ size_t long_bit_offset = bit_start % 64;
124
+ // The bit in the array where the long stops
125
+ size_t long_bit_stop = (long_start + 1) * 64;
126
+ decodedT& value = decoded[decoded_index];
127
+ encoded[long_start] = (encoded[long_start] & ~(mask << long_bit_offset)) + ((value & mask) << long_bit_offset);
128
+ if (long_bit_stop < bit_stop) {
129
+ // Overflows into the next long
130
+ // The number of bits that overflow into the next long
131
+ size_t overflow_bits = bit_stop - long_bit_stop;
132
+ // The number of bits in the previous long
133
+ size_t previous_bits = bits_per_entry - overflow_bits;
134
+ encoded[long_start + 1] = (encoded[long_start + 1] & ~(mask >> previous_bits)) + ((value & mask) >> previous_bits);
135
+ }
136
+ }
137
+ }
138
+ else {
139
+ size_t entries_per_long = 64 / bits_per_entry;
140
+ size_t decoded_index = 0;
141
+ size_t long_count = std::ceil(static_cast<float>(decoded.size()) / entries_per_long);
142
+ for (size_t encoded_index = 0; encoded_index < long_count; encoded_index++) {
143
+ auto& encoded_value = encoded[encoded_index];
144
+ encoded_value = 0;
145
+ for (
146
+ size_t offset = 0;
147
+ offset < entries_per_long && decoded_index < decoded.size();
148
+ offset++, decoded_index++
149
+ ) {
150
+ std::uint64_t value = decoded[decoded_index] & mask;
151
+ encoded_value += value << (bits_per_entry * offset);
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ // Encode the array to a long aray with at least this number of bits. The number of required bits is computed before encoding.
158
+ template <typename decodedT>
159
+ void encode_long_array_min(
160
+ const std::span<decodedT>& decoded, // The array to encode
161
+ std::span<std::uint64_t> encoded, // The array to encode into
162
+ std::uint8_t min_bits_per_entry, // The minimum number of bits of each number to use
163
+ bool dense = true
164
+ ) {
165
+ static_assert(std::is_unsigned_v<decodedT>, "decodedT must be unsigned");
166
+ if (min_bits_per_entry < 1 || 64 < min_bits_per_entry) {
167
+ throw std::invalid_argument("min_bits_per_entry must be between 1 and 64 inclusive. Got " + std::to_string(min_bits_per_entry));
168
+ }
169
+ std::uint8_t bits_per_entry = std::max(
170
+ min_bits_per_entry,
171
+ std::bit_width(*std::max_element(decoded.begin(), decoded.end()))
172
+ );
173
+ encode_long_array(decoded, encoded, bits_per_entry, dense);
174
+ }
175
+ }
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import numpy
4
+ import numpy.typing
4
5
  import typing_extensions
5
6
 
6
7
  __all__ = ["decode_long_array", "encode_long_array"]
@@ -26,7 +27,7 @@ def encode_long_array(
26
27
  bits_per_entry: None | int = None,
27
28
  dense: bool = True,
28
29
  min_bits_per_entry: int = 1,
29
- ) -> numpy.ndarray[numpy.uint64]:
30
+ ) -> numpy.typing.NDArray[numpy.uint64]:
30
31
  """
31
32
  Encode a long array (from BlockStates or Heightmaps)
32
33
 
@@ -0,0 +1 @@
1
+ from .block_mesh import BlockMesh