amulet-core 2.0a7__cp311-cp311-win_amd64.whl → 2.0.1a2.post250529084738__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 (325) 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.0a7.dist-info → amulet_core-2.0.1a2.post250529084738.dist-info}/METADATA +25 -20
  40. amulet_core-2.0.1a2.post250529084738.dist-info/RECORD +45 -0
  41. {amulet_core-2.0a7.dist-info → amulet_core-2.0.1a2.post250529084738.dist-info}/WHEEL +1 -1
  42. amulet_core-2.0.1a2.post250529084738.dist-info/entry_points.txt +2 -0
  43. amulet/__init__.cp311-win_amd64.pyd +0 -0
  44. amulet/__init__.py.cpp +0 -43
  45. amulet/__init__.pyi +0 -28
  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 -99
  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 -335
  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__.py +0 -1
  195. amulet/mesh/block/block_mesh.py +0 -369
  196. amulet/mesh/block/cube.py +0 -149
  197. amulet/mesh/block/missing_block.py +0 -20
  198. amulet/mesh/util.py +0 -17
  199. amulet/palette/biome_palette.hpp +0 -85
  200. amulet/palette/block_palette.cpp +0 -32
  201. amulet/palette/block_palette.hpp +0 -93
  202. amulet/player.py +0 -62
  203. amulet/pybind11/collections.hpp +0 -118
  204. amulet/pybind11/numpy.hpp +0 -26
  205. amulet/pybind11/py_module.hpp +0 -34
  206. amulet/pybind11/type_hints.hpp +0 -51
  207. amulet/pybind11/types.hpp +0 -25
  208. amulet/pybind11/typing.hpp +0 -7
  209. amulet/resource_pack/__init__.py +0 -62
  210. amulet/resource_pack/abc/__init__.py +0 -2
  211. amulet/resource_pack/abc/resource_pack.py +0 -38
  212. amulet/resource_pack/abc/resource_pack_manager.py +0 -87
  213. amulet/resource_pack/bedrock/__init__.py +0 -2
  214. amulet/resource_pack/bedrock/bedrock_vanilla_fix/pack_icon.png +0 -0
  215. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_carried.png +0 -0
  216. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/grass_side_carried.png +0 -0
  217. amulet/resource_pack/bedrock/bedrock_vanilla_fix/textures/blocks/water.png +0 -0
  218. amulet/resource_pack/bedrock/blockshapes/__init__.py +0 -31
  219. amulet/resource_pack/bedrock/blockshapes/air.py +0 -35
  220. amulet/resource_pack/bedrock/blockshapes/base_blockshape.py +0 -29
  221. amulet/resource_pack/bedrock/blockshapes/bubble_column.py +0 -29
  222. amulet/resource_pack/bedrock/blockshapes/cake.py +0 -46
  223. amulet/resource_pack/bedrock/blockshapes/chest.py +0 -54
  224. amulet/resource_pack/bedrock/blockshapes/comparator.py +0 -51
  225. amulet/resource_pack/bedrock/blockshapes/cross_texture.py +0 -186
  226. amulet/resource_pack/bedrock/blockshapes/cross_texture0.py +0 -17
  227. amulet/resource_pack/bedrock/blockshapes/cross_texture_green.py +0 -16
  228. amulet/resource_pack/bedrock/blockshapes/cube.py +0 -38
  229. amulet/resource_pack/bedrock/blockshapes/default.py +0 -14
  230. amulet/resource_pack/bedrock/blockshapes/door.py +0 -38
  231. amulet/resource_pack/bedrock/blockshapes/door1.py +0 -14
  232. amulet/resource_pack/bedrock/blockshapes/door2.py +0 -14
  233. amulet/resource_pack/bedrock/blockshapes/door3.py +0 -14
  234. amulet/resource_pack/bedrock/blockshapes/door4.py +0 -14
  235. amulet/resource_pack/bedrock/blockshapes/door5.py +0 -14
  236. amulet/resource_pack/bedrock/blockshapes/door6.py +0 -14
  237. amulet/resource_pack/bedrock/blockshapes/double_plant.py +0 -40
  238. amulet/resource_pack/bedrock/blockshapes/enchanting_table.py +0 -22
  239. amulet/resource_pack/bedrock/blockshapes/farmland.py +0 -22
  240. amulet/resource_pack/bedrock/blockshapes/fence.py +0 -22
  241. amulet/resource_pack/bedrock/blockshapes/flat.py +0 -55
  242. amulet/resource_pack/bedrock/blockshapes/flat_wall.py +0 -55
  243. amulet/resource_pack/bedrock/blockshapes/furnace.py +0 -44
  244. amulet/resource_pack/bedrock/blockshapes/furnace_lit.py +0 -14
  245. amulet/resource_pack/bedrock/blockshapes/green_cube.py +0 -39
  246. amulet/resource_pack/bedrock/blockshapes/ladder.py +0 -36
  247. amulet/resource_pack/bedrock/blockshapes/lilypad.py +0 -14
  248. amulet/resource_pack/bedrock/blockshapes/partial_block.py +0 -57
  249. amulet/resource_pack/bedrock/blockshapes/piston.py +0 -44
  250. amulet/resource_pack/bedrock/blockshapes/piston_arm.py +0 -72
  251. amulet/resource_pack/bedrock/blockshapes/portal_frame.py +0 -22
  252. amulet/resource_pack/bedrock/blockshapes/pressure_plate.py +0 -29
  253. amulet/resource_pack/bedrock/blockshapes/pumpkin.py +0 -36
  254. amulet/resource_pack/bedrock/blockshapes/pumpkin_carved.py +0 -14
  255. amulet/resource_pack/bedrock/blockshapes/pumpkin_lit.py +0 -14
  256. amulet/resource_pack/bedrock/blockshapes/red_dust.py +0 -14
  257. amulet/resource_pack/bedrock/blockshapes/repeater.py +0 -53
  258. amulet/resource_pack/bedrock/blockshapes/slab.py +0 -33
  259. amulet/resource_pack/bedrock/blockshapes/slab_double.py +0 -15
  260. amulet/resource_pack/bedrock/blockshapes/tree.py +0 -41
  261. amulet/resource_pack/bedrock/blockshapes/turtle_egg.py +0 -15
  262. amulet/resource_pack/bedrock/blockshapes/vine.py +0 -52
  263. amulet/resource_pack/bedrock/blockshapes/wall.py +0 -22
  264. amulet/resource_pack/bedrock/blockshapes/water.py +0 -38
  265. amulet/resource_pack/bedrock/download_resources.py +0 -147
  266. amulet/resource_pack/bedrock/resource_pack.py +0 -40
  267. amulet/resource_pack/bedrock/resource_pack_manager.py +0 -361
  268. amulet/resource_pack/bedrock/sort_blockshapes.py +0 -15
  269. amulet/resource_pack/java/__init__.py +0 -2
  270. amulet/resource_pack/java/download_resources.py +0 -212
  271. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_black.png +0 -0
  272. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_blue.png +0 -0
  273. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_brown.png +0 -0
  274. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_cyan.png +0 -0
  275. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_gray.png +0 -0
  276. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_green.png +0 -0
  277. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_blue.png +0 -0
  278. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_light_gray.png +0 -0
  279. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_lime.png +0 -0
  280. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_magenta.png +0 -0
  281. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_orange.png +0 -0
  282. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_pink.png +0 -0
  283. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_purple.png +0 -0
  284. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_red.png +0 -0
  285. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_white.png +0 -0
  286. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/banner/banner_yellow.png +0 -0
  287. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/barrier.png +0 -0
  288. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/end_portal.png +0 -0
  289. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/grass.png +0 -0
  290. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/lava.png +0 -0
  291. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/structure_void.png +0 -0
  292. amulet/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png +0 -0
  293. amulet/resource_pack/java/java_vanilla_fix/pack.png +0 -0
  294. amulet/resource_pack/java/resource_pack.py +0 -44
  295. amulet/resource_pack/java/resource_pack_manager.py +0 -551
  296. amulet/resource_pack/unknown_resource_pack.py +0 -10
  297. amulet/selection/__init__.py +0 -2
  298. amulet/selection/abstract_selection.py +0 -342
  299. amulet/selection/box.py +0 -852
  300. amulet/selection/group.py +0 -481
  301. amulet/utils/__init__.pyi +0 -23
  302. amulet/utils/call_spec/__init__.py +0 -24
  303. amulet/utils/call_spec/_call_spec.py +0 -257
  304. amulet/utils/comment_json.py +0 -188
  305. amulet/utils/format_utils.py +0 -41
  306. amulet/utils/generator.py +0 -18
  307. amulet/utils/matrix.py +0 -243
  308. amulet/utils/numpy.hpp +0 -36
  309. amulet/utils/numpy.pyi +0 -11
  310. amulet/utils/numpy_helpers.py +0 -19
  311. amulet/utils/shareable_lock.py +0 -335
  312. amulet/utils/signal/__init__.py +0 -10
  313. amulet/utils/signal/_signal.py +0 -228
  314. amulet/utils/task_manager.py +0 -235
  315. amulet/utils/typed_property.py +0 -111
  316. amulet/utils/weakref.py +0 -70
  317. amulet/utils/world_utils.py +0 -102
  318. amulet/version.cpp +0 -136
  319. amulet/version.hpp +0 -142
  320. amulet/version.py.cpp +0 -281
  321. amulet_core-2.0a7.dist-info/RECORD +0 -295
  322. amulet_core-2.0a7.dist-info/entry_points.txt +0 -2
  323. /amulet/{__pyinstaller → core/__pyinstaller}/__init__.py +0 -0
  324. /amulet/{py.typed → core/py.typed} +0 -0
  325. {amulet_core-2.0a7.dist-info → amulet_core-2.0.1a2.post250529084738.dist-info}/top_level.txt +0 -0
@@ -1,44 +0,0 @@
1
- import os
2
- import json
3
-
4
- from amulet.resource_pack.abc import BaseResourcePack
5
-
6
-
7
- class JavaResourcePack(BaseResourcePack):
8
- """A class to hold the bare bones information about the resource pack.
9
- Holds the pack format, description and if the pack is valid.
10
- This information can be used in a viewer to display the packs to the user."""
11
-
12
- def __init__(self, resource_pack_path: str):
13
- super().__init__(resource_pack_path)
14
- meta_path = os.path.join(resource_pack_path, "pack.mcmeta")
15
- self._pack_format = 0
16
- if os.path.isfile(meta_path):
17
- try:
18
- with open(meta_path) as f:
19
- pack_mcmeta = json.load(f)
20
- except json.JSONDecodeError:
21
- pass
22
- else:
23
- if "pack" in pack_mcmeta:
24
- if "description" in pack_mcmeta["pack"]:
25
- self._pack_description = str(pack_mcmeta["pack"]["description"])
26
- if "pack_format" in pack_mcmeta["pack"]:
27
- self._pack_format = pack_mcmeta["pack"]["pack_format"]
28
- self._valid_pack = True
29
-
30
- pack_icon_path = os.path.join(resource_pack_path, "pack.png")
31
- if os.path.isfile(pack_icon_path):
32
- self._pack_icon = pack_icon_path
33
-
34
- @staticmethod
35
- def is_valid(pack_path: str) -> bool:
36
- return os.path.isfile(os.path.join(pack_path, "pack.mcmeta"))
37
-
38
- def __repr__(self) -> str:
39
- return f"JavaResourcePack({self._root_dir})"
40
-
41
- @property
42
- def pack_format(self) -> int:
43
- """int - pack format number"""
44
- return self._pack_format
@@ -1,551 +0,0 @@
1
- import os
2
- import json
3
- import copy
4
- from typing import Union, Iterable, Iterator, Optional
5
- from PIL import Image
6
- import numpy
7
- import glob
8
- import itertools
9
- import logging
10
- import re
11
-
12
- import amulet_nbt
13
-
14
- from amulet.block import Block
15
- from amulet.resource_pack import BaseResourcePackManager
16
- from amulet.resource_pack.java import JavaResourcePack
17
- from amulet.mesh.block.block_mesh import (
18
- BlockMesh,
19
- FACE_KEYS,
20
- Transparency,
21
- )
22
- from amulet.mesh.util import rotate_3d
23
- from amulet.mesh.block.cube import (
24
- cube_face_lut,
25
- uv_rotation_lut,
26
- tri_face,
27
- )
28
-
29
- log = logging.getLogger(__name__)
30
-
31
-
32
- UselessImageGroups = {
33
- "colormap",
34
- "effect",
35
- "environment",
36
- "font",
37
- "gui",
38
- "map",
39
- "mob_effect",
40
- "particle",
41
- }
42
-
43
- _PropertiesPattern = re.compile(r"(?P<name>[a-zA-Z0-9_]+)=(?P<value>[a-zA-Z0-9_]+),?")
44
-
45
-
46
- class JavaResourcePackManager(BaseResourcePackManager[JavaResourcePack]):
47
- """A class to load and handle the data from the packs.
48
- Packs are given as a list with the later packs overwriting the earlier ones."""
49
-
50
- def __init__(
51
- self,
52
- resource_packs: Union[JavaResourcePack, Iterable[JavaResourcePack]],
53
- load: bool = True,
54
- ) -> None:
55
- super().__init__()
56
- self._blockstate_files: dict[tuple[str, str], dict] = {}
57
- self._textures: dict[tuple[str, str], str] = {}
58
- self._texture_is_transparent: dict[str, tuple[float, bool]] = {}
59
- self._model_files: dict[tuple[str, str], dict] = {}
60
- if isinstance(resource_packs, Iterable):
61
- self._packs = list(resource_packs)
62
- elif isinstance(resource_packs, JavaResourcePack):
63
- self._packs = [resource_packs]
64
- else:
65
- raise Exception(f"Invalid format {resource_packs}")
66
- if load:
67
- for _ in self.reload():
68
- pass
69
-
70
- def _unload(self) -> None:
71
- """Clear all loaded resources."""
72
- super()._unload()
73
- self._blockstate_files.clear()
74
- self._textures.clear()
75
- self._texture_is_transparent.clear()
76
- self._model_files.clear()
77
-
78
- def _load_iter(self) -> Iterator[float]:
79
- blockstate_file_paths: dict[tuple[str, str], str] = {}
80
- model_file_paths: dict[tuple[str, str], str] = {}
81
-
82
- transparency_cache_path = os.path.join(
83
- os.environ["CACHE_DIR"], "resource_packs", "java", "transparency_cache.json"
84
- )
85
- self._load_transparency_cache(transparency_cache_path)
86
-
87
- self._textures[("minecraft", "missing_no")] = self.missing_no
88
-
89
- pack_count = len(self._packs)
90
-
91
- for pack_index, pack in enumerate(self._packs):
92
- # pack_format=2 textures/blocks, textures/items - case sensitive
93
- # pack_format=3 textures/blocks, textures/items - lower case
94
- # pack_format=4 textures/block, textures/item
95
- # pack_format=5 model paths and texture paths are now optionally namespaced
96
-
97
- pack_progress = pack_index / pack_count
98
- yield pack_progress
99
-
100
- if pack.valid_pack and pack.pack_format >= 2:
101
- image_paths = glob.glob(
102
- os.path.join(
103
- glob.escape(pack.root_dir),
104
- "assets",
105
- "*", # namespace
106
- "textures",
107
- "**",
108
- "*.png",
109
- ),
110
- recursive=True,
111
- )
112
- image_count = len(image_paths)
113
- sub_progress = pack_progress
114
- for image_index, texture_path in enumerate(image_paths):
115
- _, namespace, _, *rel_path_list = os.path.normpath(
116
- os.path.relpath(texture_path, pack.root_dir)
117
- ).split(os.sep)
118
- if rel_path_list[0] not in UselessImageGroups:
119
- rel_path = "/".join(rel_path_list)[:-4]
120
- self._textures[(namespace, rel_path)] = texture_path
121
- if (
122
- os.stat(texture_path).st_mtime
123
- != self._texture_is_transparent.get(texture_path, [0])[0]
124
- ):
125
- im: Image.Image = Image.open(texture_path)
126
- if im.mode == "RGBA":
127
- alpha = numpy.array(im.getchannel("A").getdata())
128
- texture_is_transparent = bool(numpy.any(alpha != 255))
129
- else:
130
- texture_is_transparent = False
131
-
132
- self._texture_is_transparent[texture_path] = (
133
- os.stat(texture_path).st_mtime,
134
- texture_is_transparent,
135
- )
136
- yield sub_progress + image_index / (image_count * pack_count * 3)
137
-
138
- blockstate_paths = glob.glob(
139
- os.path.join(
140
- glob.escape(pack.root_dir),
141
- "assets",
142
- "*", # namespace
143
- "blockstates",
144
- "*.json",
145
- )
146
- )
147
- blockstate_count = len(blockstate_paths)
148
- sub_progress = pack_progress + 1 / (pack_count * 3)
149
- for blockstate_index, blockstate_path in enumerate(blockstate_paths):
150
- _, namespace, _, blockstate_file = os.path.normpath(
151
- os.path.relpath(blockstate_path, pack.root_dir)
152
- ).split(os.sep)
153
- blockstate_file_paths[(namespace, blockstate_file[:-5])] = (
154
- blockstate_path
155
- )
156
- yield sub_progress + (blockstate_index) / (
157
- blockstate_count * pack_count * 3
158
- )
159
-
160
- model_paths = glob.glob(
161
- os.path.join(
162
- glob.escape(pack.root_dir),
163
- "assets",
164
- "*", # namespace
165
- "models",
166
- "**",
167
- "*.json",
168
- ),
169
- recursive=True,
170
- )
171
- model_count = len(model_paths)
172
- sub_progress = pack_progress + 2 / (pack_count * 3)
173
- for model_index, model_path in enumerate(model_paths):
174
- _, namespace, _, *rel_path_list = os.path.normpath(
175
- os.path.relpath(model_path, pack.root_dir)
176
- ).split(os.sep)
177
- rel_path = "/".join(rel_path_list)[:-5]
178
- model_file_paths[(namespace, rel_path.replace(os.sep, "/"))] = (
179
- model_path
180
- )
181
- yield sub_progress + (model_index) / (model_count * pack_count * 3)
182
-
183
- os.makedirs(os.path.dirname(transparency_cache_path), exist_ok=True)
184
- with open(transparency_cache_path, "w") as f:
185
- json.dump(self._texture_is_transparent, f)
186
-
187
- for key, path in blockstate_file_paths.items():
188
- with open(path) as fi:
189
- try:
190
- self._blockstate_files[key] = json.load(fi)
191
- except json.JSONDecodeError:
192
- log.error(f"Failed to parse blockstate file {path}")
193
-
194
- for key, path in model_file_paths.items():
195
- with open(path) as fi:
196
- try:
197
- self._model_files[key] = json.load(fi)
198
- except json.JSONDecodeError:
199
- log.error(f"Failed to parse model file file {path}")
200
-
201
- @property
202
- def textures(self) -> tuple[str, ...]:
203
- """Returns a tuple of all the texture paths in the resource pack."""
204
- return tuple(self._textures.values())
205
-
206
- def get_texture_path(self, namespace: Optional[str], relative_path: str) -> str:
207
- """Get the absolute texture path from the namespace and relative path pair"""
208
- if namespace is None:
209
- return self.missing_no
210
- key = (namespace, relative_path)
211
- if key in self._textures:
212
- return self._textures[key]
213
- else:
214
- return self.missing_no
215
-
216
- @staticmethod
217
- def parse_state_val(val: Union[str, bool]) -> list:
218
- """Convert the json block state format into a consistent format."""
219
- if isinstance(val, str):
220
- return [amulet_nbt.TAG_String(v) for v in val.split("|")]
221
- elif isinstance(val, bool):
222
- return [
223
- amulet_nbt.TAG_String("true") if val else amulet_nbt.TAG_String("false")
224
- ]
225
- else:
226
- raise Exception(f"Could not parse state val {val}")
227
-
228
- def _get_model(self, block: Block) -> BlockMesh:
229
- """Find the model paths for a given block state and load them."""
230
- if (block.namespace, block.base_name) in self._blockstate_files:
231
- blockstate: dict = self._blockstate_files[
232
- (block.namespace, block.base_name)
233
- ]
234
- if "variants" in blockstate:
235
- for variant in blockstate["variants"]:
236
- if variant == "":
237
- try:
238
- return self._load_blockstate_model(
239
- blockstate["variants"][variant]
240
- )
241
- except Exception as e:
242
- log.error(
243
- f"Failed to load block model {blockstate['variants'][variant]}\n{e}"
244
- )
245
- else:
246
- properties_match = _PropertiesPattern.finditer(f",{variant}")
247
- if all(
248
- block.properties.get(
249
- match.group("name"),
250
- amulet_nbt.TAG_String(match.group("value")),
251
- ).py_data
252
- == match.group("value")
253
- for match in properties_match
254
- ):
255
- try:
256
- return self._load_blockstate_model(
257
- blockstate["variants"][variant]
258
- )
259
- except Exception as e:
260
- log.error(
261
- f"Failed to load block model {blockstate['variants'][variant]}\n{e}"
262
- )
263
-
264
- elif "multipart" in blockstate:
265
- models = []
266
-
267
- for case in blockstate["multipart"]:
268
- try:
269
- if "when" in case:
270
- if "OR" in case["when"]:
271
- if not any(
272
- all(
273
- block.properties.get(prop, None)
274
- in self.parse_state_val(val)
275
- for prop, val in prop_match.items()
276
- )
277
- for prop_match in case["when"]["OR"]
278
- ):
279
- continue
280
- elif "AND" in case["when"]:
281
- if not all(
282
- all(
283
- block.properties.get(prop, None)
284
- in self.parse_state_val(val)
285
- for prop, val in prop_match.items()
286
- )
287
- for prop_match in case["when"]["AND"]
288
- ):
289
- continue
290
- elif not all(
291
- block.properties.get(prop, None)
292
- in self.parse_state_val(val)
293
- for prop, val in case["when"].items()
294
- ):
295
- continue
296
-
297
- if "apply" in case:
298
- try:
299
- models.append(
300
- self._load_blockstate_model(case["apply"])
301
- )
302
-
303
- except Exception as e:
304
- log.error(
305
- f"Failed to load block model {case['apply']}\n{e}"
306
- )
307
- except Exception as e:
308
- log.error(f"Failed to parse block state for {block}\n{e}")
309
-
310
- return BlockMesh.merge(models)
311
-
312
- return self.missing_block
313
-
314
- def _load_blockstate_model(
315
- self, blockstate_value: Union[dict, list[dict]]
316
- ) -> BlockMesh:
317
- """Load the model(s) associated with a block state and apply rotations if needed."""
318
- if isinstance(blockstate_value, list):
319
- blockstate_value = blockstate_value[0]
320
- if "model" not in blockstate_value:
321
- return self.missing_block
322
- model_path = blockstate_value["model"]
323
- rotx = int(blockstate_value.get("x", 0) // 90)
324
- roty = int(blockstate_value.get("y", 0) // 90)
325
- uvlock = blockstate_value.get("uvlock", False)
326
-
327
- model = copy.deepcopy(self._load_block_model(model_path))
328
-
329
- # TODO: rotate model based on uv_lock
330
- return model.rotate(rotx, roty)
331
-
332
- def _load_block_model(self, model_path: str) -> BlockMesh:
333
- """Load the model file associated with the Block and convert to a BlockMesh."""
334
- # recursively load model files into one dictionary
335
- java_model = self._recursive_load_block_model(model_path)
336
-
337
- # set up some variables
338
- texture_dict = {}
339
- textures = []
340
- texture_count = 0
341
- vert_count = {side: 0 for side in FACE_KEYS}
342
- verts_src: dict[Optional[str], list[numpy.ndarray]] = {
343
- side: [] for side in FACE_KEYS
344
- }
345
- tverts_src: dict[Optional[str], list[numpy.ndarray]] = {
346
- side: [] for side in FACE_KEYS
347
- }
348
- tint_verts_src: dict[Optional[str], list[float]] = {
349
- side: [] for side in FACE_KEYS
350
- }
351
- faces_src: dict[Optional[str], list[numpy.ndarray]] = {
352
- side: [] for side in FACE_KEYS
353
- }
354
-
355
- texture_indexes_src: dict[Optional[str], list[int]] = {
356
- side: [] for side in FACE_KEYS
357
- }
358
- transparent = Transparency.Partial
359
-
360
- if java_model.get("textures", {}) and not java_model.get("elements"):
361
- return self.missing_block
362
-
363
- for element in java_model.get("elements", {}):
364
- # iterate through elements (one cube per element)
365
- element_faces = element.get("faces", {})
366
-
367
- opaque_face_count = 0
368
- if (
369
- transparent
370
- and "rotation" not in element
371
- and element.get("to", [16, 16, 16]) == [16, 16, 16]
372
- and element.get("from", [0, 0, 0]) == [0, 0, 0]
373
- and len(element_faces) >= 6
374
- ):
375
- # if the block is not yet defined as a solid block
376
- # and this element is a full size element
377
- # check if the texture is opaque
378
- transparent = Transparency.FullTranslucent
379
- check_faces = True
380
- else:
381
- check_faces = False
382
-
383
- # lower and upper box coordinates
384
- corners = numpy.sort(
385
- numpy.array(
386
- [element.get("to", [16, 16, 16]), element.get("from", [0, 0, 0])],
387
- float,
388
- )
389
- / 16,
390
- 0,
391
- )
392
-
393
- # vertex coordinates of the box
394
- box_coordinates = numpy.array(
395
- list(itertools.product(corners[:, 0], corners[:, 1], corners[:, 2]))
396
- )
397
-
398
- for face_dir in element_faces:
399
- if face_dir in cube_face_lut:
400
- # get the cull direction. If there is an opaque block in this direction then cull this face
401
- cull_dir = element_faces[face_dir].get("cullface", None)
402
- if cull_dir not in FACE_KEYS:
403
- cull_dir = None
404
-
405
- # get the relative texture path for the texture used
406
- texture_relative_path = element_faces[face_dir].get("texture", None)
407
- while isinstance(
408
- texture_relative_path, str
409
- ) and texture_relative_path.startswith("#"):
410
- texture_relative_path = java_model["textures"].get(
411
- texture_relative_path[1:], None
412
- )
413
- texture_path_list = texture_relative_path.split(":", 1)
414
- if len(texture_path_list) == 2:
415
- namespace, texture_relative_path = texture_path_list
416
- else:
417
- namespace = "minecraft"
418
-
419
- texture_path = self.get_texture_path(
420
- namespace, texture_relative_path
421
- )
422
-
423
- if check_faces:
424
- if self._texture_is_transparent[texture_path][1]:
425
- check_faces = False
426
- else:
427
- opaque_face_count += 1
428
-
429
- # get the texture
430
- if texture_relative_path not in texture_dict:
431
- texture_dict[texture_relative_path] = texture_count
432
- textures.append(texture_path)
433
- texture_count += 1
434
-
435
- # texture index for the face
436
- texture_index = texture_dict[texture_relative_path]
437
-
438
- # get the uv values for each vertex
439
- # TODO: get the uv based on box location if not defined
440
- texture_uv = (
441
- numpy.array(
442
- element_faces[face_dir].get("uv", [0, 0, 16, 16]),
443
- float,
444
- )
445
- / 16
446
- )
447
- texture_rotation = element_faces[face_dir].get("rotation", 0)
448
- uv_slice = (
449
- uv_rotation_lut[2 * int(texture_rotation / 90) :]
450
- + uv_rotation_lut[: 2 * int(texture_rotation / 90)]
451
- )
452
-
453
- # merge the vertex coordinates and texture coordinates
454
- face_verts = box_coordinates[cube_face_lut[face_dir]]
455
- if "rotation" in element:
456
- rotation = element["rotation"]
457
- origin = [r / 16 for r in rotation.get("origin", [8, 8, 8])]
458
- angle = rotation.get("angle", 0)
459
- axis = rotation.get("axis", "x")
460
- angles = [0, 0, 0]
461
- if axis == "x":
462
- angles[0] = -angle
463
- elif axis == "y":
464
- angles[1] = -angle
465
- elif axis == "z":
466
- angles[2] = -angle
467
- face_verts = rotate_3d(face_verts, *angles, *origin)
468
-
469
- verts_src[cull_dir].append(
470
- face_verts
471
- ) # vertex coordinates for this face
472
-
473
- tverts_src[cull_dir].append(
474
- texture_uv[uv_slice].reshape((-1, 2)) # texture vertices
475
- )
476
- if "tintindex" in element_faces[face_dir]:
477
- tint_verts_src[cull_dir] += [
478
- 0,
479
- 1,
480
- 0,
481
- ] * 4 # TODO: set this up for each supported block
482
- else:
483
- tint_verts_src[cull_dir] += [1, 1, 1] * 4
484
-
485
- # merge the face indexes and texture index
486
- face_table = tri_face + vert_count[cull_dir]
487
- texture_indexes_src[cull_dir] += [texture_index, texture_index]
488
-
489
- # faces stored under cull direction because this is the criteria to render them or not
490
- faces_src[cull_dir].append(face_table)
491
-
492
- vert_count[cull_dir] += 4
493
-
494
- if opaque_face_count == 6:
495
- transparent = Transparency.FullOpaque
496
-
497
- verts: dict[Optional[str], numpy.ndarray] = {}
498
- tverts: dict[Optional[str], numpy.ndarray] = {}
499
- tint_verts: dict[Optional[str], numpy.ndarray] = {}
500
- faces: dict[Optional[str], numpy.ndarray] = {}
501
- texture_indexes: dict[Optional[str], numpy.ndarray] = {}
502
-
503
- for cull_dir in FACE_KEYS:
504
- face_array = faces_src[cull_dir]
505
- if len(face_array) > 0:
506
- faces[cull_dir] = numpy.concatenate(face_array, axis=None)
507
- tint_verts[cull_dir] = numpy.concatenate(
508
- tint_verts_src[cull_dir], axis=None
509
- )
510
- verts[cull_dir] = numpy.concatenate(verts_src[cull_dir], axis=None)
511
- tverts[cull_dir] = numpy.concatenate(tverts_src[cull_dir], axis=None)
512
- texture_indexes[cull_dir] = numpy.array(
513
- texture_indexes_src[cull_dir], dtype=numpy.uint32
514
- )
515
-
516
- return BlockMesh(
517
- 3,
518
- verts,
519
- tverts,
520
- tint_verts,
521
- faces,
522
- texture_indexes,
523
- tuple(textures),
524
- transparent,
525
- )
526
-
527
- def _recursive_load_block_model(self, model_path: str) -> dict:
528
- """Load a model json file and recursively load and merge the parent entries into one json file."""
529
- model_path_list = model_path.split(":", 1)
530
- if len(model_path_list) == 2:
531
- namespace, model_path = model_path_list
532
- else:
533
- namespace = "minecraft"
534
- if (namespace, model_path) in self._model_files:
535
- model = self._model_files[(namespace, model_path)]
536
-
537
- if "parent" in model:
538
- parent_model = self._recursive_load_block_model(model["parent"])
539
- else:
540
- parent_model = {}
541
- if "textures" in model:
542
- if "textures" not in parent_model:
543
- parent_model["textures"] = {}
544
- for key, val in model["textures"].items():
545
- parent_model["textures"][key] = val
546
- if "elements" in model:
547
- parent_model["elements"] = model["elements"]
548
-
549
- return parent_model
550
-
551
- return {}
@@ -1,10 +0,0 @@
1
- from amulet.resource_pack.abc.resource_pack import BaseResourcePack
2
-
3
-
4
- class UnknownResourcePack(BaseResourcePack):
5
- def __repr__(self) -> str:
6
- return f"UnknownResourcePack({self._root_dir})"
7
-
8
- @staticmethod
9
- def is_valid(pack_path: str) -> bool:
10
- return True
@@ -1,2 +0,0 @@
1
- from .group import SelectionGroup
2
- from .box import SelectionBox