stewbeet 2.0.15__tar.gz → 2.0.17__tar.gz

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 stewbeet might be problematic. Click here for more details.

Files changed (143) hide show
  1. {stewbeet-2.0.15 → stewbeet-2.0.17}/PKG-INFO +1 -1
  2. {stewbeet-2.0.15 → stewbeet-2.0.17}/pyproject.toml +1 -1
  3. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/__init__.py +5 -0
  4. stewbeet-2.0.17/stewbeet/all.py +50 -0
  5. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/constants.py +6 -6
  6. stewbeet-2.0.17/stewbeet/core/utils/io.py +161 -0
  7. stewbeet-2.0.17/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  8. stewbeet-2.0.17/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  9. stewbeet-2.0.17/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  10. stewbeet-2.0.17/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  11. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  12. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  13. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  14. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/archive/__init__.py +12 -0
  15. stewbeet-2.0.17/stewbeet/plugins/finalyze/last_final/__init__.py +30 -0
  16. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/initialize/__init__.py +109 -124
  17. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/initialize/source_lore_font.py +7 -0
  18. stewbeet-2.0.15/stewbeet/core/utils/io.py +0 -136
  19. stewbeet-2.0.15/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  20. stewbeet-2.0.15/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  21. stewbeet-2.0.15/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  22. stewbeet-2.0.15/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  23. {stewbeet-2.0.15 → stewbeet-2.0.17}/.gitignore +0 -0
  24. {stewbeet-2.0.15 → stewbeet-2.0.17}/LICENSE +0 -0
  25. {stewbeet-2.0.15 → stewbeet-2.0.17}/README.md +0 -0
  26. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/__main__.py +0 -0
  27. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/__init__.py +0 -0
  28. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  29. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/github.py +0 -0
  30. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/modrinth.py +0 -0
  31. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/pmc.py +0 -0
  32. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/smithed.py +0 -0
  33. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/__init__.py +0 -0
  34. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/__memory__.py +0 -0
  35. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/__init__.py +0 -0
  36. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/completion.py +0 -0
  37. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/equipments.py +0 -0
  38. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/materials.py +0 -0
  39. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/records.py +0 -0
  40. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  41. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/text.py +0 -0
  42. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/ingredients.py +0 -0
  43. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/utils/sounds.py +0 -0
  44. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/__init__.py +0 -0
  45. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/bookshelf.py +0 -0
  46. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/bookshelf_config.json +0 -0
  47. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  48. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  49. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  50. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  51. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  52. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  53. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  54. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  55. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  56. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  57. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  58. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  59. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  60. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  61. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  62. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  63. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  64. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  65. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  66. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  67. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  68. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  69. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  70. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  71. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  72. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  73. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  74. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/headers/object.py +0 -0
  75. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  76. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  77. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  78. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  79. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  80. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  81. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  82. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  83. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  84. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  85. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  86. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  87. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  88. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  89. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  90. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  91. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  92. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  93. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  94. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  95. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  96. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  97. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  98. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  99. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  100. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  101. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  102. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  103. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  104. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  105. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  106. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  107. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  108. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  109. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
  110. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  111. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
  112. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
  113. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
  114. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/main.py +0 -0
  115. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/other_utils.py +0 -0
  116. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
  117. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/shared_import.py +0 -0
  118. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  119. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  120. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  121. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  122. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  123. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  124. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  125. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  126. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  127. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  128. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  129. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  130. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  131. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  132. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  133. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  134. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  135. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  136. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  137. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  138. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  139. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  140. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  141. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  142. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
  143. {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.0.15
3
+ Version: 2.0.17
4
4
  Summary: Beet Framework made to help generating advanced Minecraft datapack contents
5
5
  Project-URL: Homepage, https://github.com/Stoupy51/stewbeet
6
6
  Project-URL: Issues, https://github.com/Stoupy51/stewbeet/issues
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stewbeet"
8
- version = "2.0.15"
8
+ version = "2.0.17"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -9,3 +9,8 @@ from .plugins.initialize.source_lore_font import find_pack_png
9
9
  from .plugins.resource_pack.item_models.object import AutoModel
10
10
  from .plugins.resource_pack.sounds import add_sound
11
11
 
12
+
13
+ def beet_default(ctx: Context):
14
+ """ Initializes the StewBeet package. """
15
+ ctx.require("stewbeet.plugins.initialize")
16
+
@@ -0,0 +1,50 @@
1
+
2
+ # Imports
3
+ from beet import Context
4
+
5
+ # Constants
6
+ GENERATION_PLUGINS = (
7
+ "stewbeet.plugins.verify_definitions",
8
+ "stewbeet.plugins.resource_pack.sounds",
9
+ "stewbeet.plugins.resource_pack.item_models",
10
+ "stewbeet.plugins.resource_pack.check_power_of_2",
11
+ "stewbeet.plugins.custom_recipes",
12
+ "stewbeet.plugins.ingame_manual",
13
+ "stewbeet.plugins.datapack.loading",
14
+ "stewbeet.plugins.datapack.custom_blocks",
15
+ "stewbeet.plugins.datapack.loot_tables",
16
+ "stewbeet.plugins.compatibilities.simpledrawer",
17
+ "stewbeet.plugins.compatibilities.neo_enchant"
18
+ )
19
+ FINALYZE_PLUGINS = (
20
+ "stewbeet.plugins.finalyze.custom_blocks_ticking",
21
+ "stewbeet.plugins.finalyze.basic_datapack_structure",
22
+ "stewbeet.plugins.finalyze.dependencies",
23
+ "stewbeet.plugins.finalyze.check_unused_textures",
24
+ "stewbeet.plugins.finalyze.last_final",
25
+ "stewbeet.plugins.auto.headers",
26
+ "stewbeet.plugins.archive",
27
+ "stewbeet.plugins.merge_smithed_weld",
28
+ "stewbeet.plugins.copy_to_destination",
29
+ "stewbeet.plugins.compute_sha1"
30
+ )
31
+
32
+ def beet_default(ctx: Context):
33
+ """ Run all plugins that should run after definitions are loaded.
34
+ This function will yield before finalizing the project (so users can run their own plugins in the middle of the pipeline).
35
+
36
+ Requires:
37
+ - StewBeet to be initialized (e.g. from stewbeet.plugins.initialize).
38
+ - Definitions to be loaded
39
+ """
40
+ # Assertions
41
+ for x in GENERATION_PLUGINS:
42
+ ctx.require(x)
43
+
44
+ # Yield to allow user code to run
45
+ yield
46
+
47
+ # After user code, run the final plugins
48
+ for x in FINALYZE_PLUGINS:
49
+ ctx.require(x)
50
+
@@ -90,12 +90,12 @@ def official_lib_used(lib: str) -> bool:
90
90
  return is_used
91
91
 
92
92
  OFFICIAL_LIBS: dict[str, dict] = {
93
- "common_signals": {"version":[0, 1, 0], "name":"Common Signals", "url":"https://github.com/Stoupy51/CommonSignals", "is_used": False},
94
- "smithed.custom_block": {"version":[0, 7, 0], "name":"Smithed Custom Block", "url":"https://wiki.smithed.dev/libraries/custom-block/", "is_used": False},
95
- "smithed.crafter": {"version":[0, 7, 0], "name":"Smithed Crafter", "url":"https://wiki.smithed.dev/libraries/crafter/", "is_used": False},
96
- "furnace_nbt_recipes": {"version":[1, 9, 0], "name":"Furnace NBT Recipes", "url":"https://github.com/Stoupy51/FurnaceNbtRecipes", "is_used": False},
97
- "smart_ore_generation": {"version":[1, 7, 1], "name":"SmartOreGeneration", "url":"https://github.com/Stoupy51/SmartOreGeneration", "is_used": False},
98
- "itemio": {"version":[1, 4, 0], "name":"ItemIO", "url":"https://github.com/edayot/ItemIO", "is_used": False},
93
+ "common_signals": {"version":[0, 1, 1], "name":"Common Signals", "url":"https://github.com/Stoupy51/CommonSignals", "is_used": False},
94
+ "smithed.custom_block": {"version":[0, 7, 1], "name":"Smithed Custom Block", "url":"https://wiki.smithed.dev/libraries/custom-block/", "is_used": False},
95
+ "smithed.crafter": {"version":[0, 7, 1], "name":"Smithed Crafter", "url":"https://wiki.smithed.dev/libraries/crafter/", "is_used": False},
96
+ "furnace_nbt_recipes": {"version":[1, 9, 1], "name":"Furnace NBT Recipes", "url":"https://github.com/Stoupy51/FurnaceNbtRecipes", "is_used": False},
97
+ "smart_ore_generation": {"version":[1, 7, 2], "name":"SmartOreGeneration", "url":"https://github.com/Stoupy51/SmartOreGeneration", "is_used": False},
98
+ "itemio": {"version":[1, 4, 1], "name":"ItemIO", "url":"https://github.com/edayot/ItemIO", "is_used": False},
99
99
  **BOOKSHELF_MODULES,
100
100
  }
101
101
 
@@ -0,0 +1,161 @@
1
+
2
+ # Imports
3
+ from typing import Any
4
+
5
+ from beet import Function, FunctionTag, JsonFile
6
+ from beet.core.utils import JsonDict
7
+ from stouputils.collections import unique_list
8
+ from stouputils.io import super_json_dump
9
+
10
+ from ..__memory__ import Mem
11
+
12
+
13
+ # Functions
14
+ def write_function_tag(path: str, functions: list[Any] | None = None, prepend: bool = False) -> None:
15
+ """ Write a function tag at the given path.
16
+
17
+ Args:
18
+ path (str): The path to the function tag (ex: "namespace:something" for 'data/namespace/tags/function/something.json')
19
+ functions (list[Any] | None): The functions to add to the tag
20
+ prepend (bool): If the functions should be prepended instead of appended
21
+ """
22
+ if path.endswith(".json"):
23
+ path = path[:-len(".json")]
24
+ tag: FunctionTag = Mem.ctx.data.function_tags.setdefault(path)
25
+ data: JsonDict = tag.data
26
+ if not data.get("values"):
27
+ data["values"] = functions or []
28
+
29
+ if prepend:
30
+ data["values"] = functions + data["values"]
31
+ else:
32
+ data["values"].extend(functions or [])
33
+ data["values"] = unique_list(data["values"])
34
+ tag.encoder = super_json_dump
35
+
36
+
37
+ def read_function(path: str) -> str:
38
+ """ Read the content of a function at the given path.
39
+
40
+ Args:
41
+ path (str): The path to the function (ex: "namespace:folder/function_name")
42
+
43
+ Returns:
44
+ str: The content of the function
45
+ """
46
+ if path.endswith(".mcfunction"):
47
+ path = path[:-len(".mcfunction")]
48
+ return Mem.ctx.data.functions[path].text
49
+
50
+
51
+ def write_function(path: str, content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
52
+ """ Write the content to the function at the given path.
53
+
54
+ Args:
55
+ path (str): The path to the function (ex: "namespace:folder/function_name")
56
+ content (str): The content to write
57
+ overwrite (bool): If the file should be overwritten (default: Append the content)
58
+ prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
59
+ tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
60
+ """
61
+ if path.endswith(".mcfunction"):
62
+ path = path[:-len(".mcfunction")]
63
+ if overwrite:
64
+ Mem.ctx.data.functions[path] = Function(content)
65
+ else:
66
+ if prepend:
67
+ Mem.ctx.data.functions.setdefault(path).prepend(content)
68
+ else:
69
+ Mem.ctx.data.functions.setdefault(path).append(content)
70
+ if tags:
71
+ for tag in tags:
72
+ write_function_tag(tag, [path], prepend)
73
+
74
+
75
+ def write_load_file(content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
76
+ """ Write the content to the load file
77
+
78
+ Args:
79
+ content (str): The content to write
80
+ overwrite (bool): If the file should be overwritten (default: Append the content)
81
+ prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
82
+ tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
83
+ """
84
+ write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/load/confirm_load", content, overwrite, prepend, tags)
85
+
86
+
87
+ def write_tick_file(content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
88
+ """ Write the content to the tick file
89
+
90
+ Args:
91
+ content (str): The content to write
92
+ overwrite (bool): If the file should be overwritten (default: Append the content)
93
+ prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
94
+ tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
95
+ """
96
+ write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/tick", content, overwrite, prepend, tags)
97
+
98
+
99
+ def write_versioned_function(path: str, content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
100
+ """ Write the content to a versioned function at the given path.
101
+
102
+ Args:
103
+ path (str): The path to the function (ex: "folder/function_name")
104
+ content (str): The content to write
105
+ overwrite (bool): If the file should be overwritten (default: Append the content)
106
+ prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
107
+ tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
108
+ """
109
+ write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/{path}", content, overwrite, prepend, tags)
110
+
111
+
112
+ # Merge two dict recuirsively
113
+ def super_merge_dict(dict1: dict, dict2: dict) -> dict:
114
+ """ Merge the two dictionnaries recursively without modifying originals
115
+ Args:
116
+ dict1 (dict): The first dictionnary
117
+ dict2 (dict): The second dictionnary
118
+ Returns:
119
+ dict: The merged dictionnary
120
+ """
121
+ # Copy first dictionnary
122
+ new_dict = {}
123
+ for key, value in dict1.items():
124
+ new_dict[key] = value
125
+
126
+ # For each key of the second dictionnary,
127
+ for key, value in dict2.items():
128
+
129
+ # If key exists in dict1, and both values are also dict, merge recursively
130
+ if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict):
131
+ new_dict[key] = super_merge_dict(dict1[key], value)
132
+
133
+ # Else if it's a list, merge it
134
+ elif key in dict1 and isinstance(dict1[key], list) and isinstance(value, list):
135
+ new_dict[key] = dict1[key] + value
136
+ if not any(isinstance(x, dict) for x in new_dict[key]):
137
+ new_dict[key] = unique_list(new_dict[key])
138
+
139
+ # Else, just overwrite or add value
140
+ else:
141
+ new_dict[key] = value
142
+
143
+ # Return the new dict
144
+ return new_dict
145
+
146
+ def set_json_encoder(obj: JsonFile, max_level: int | None = None, indent: str | int = '\t') -> JsonFile:
147
+ """ Set the encoder of the given object to super_json_dump
148
+
149
+ Args:
150
+ obj (JsonFile): The object to set the encoder for
151
+ max_level (int | None): The maximum level of the JSON dump, or None for default behavior
152
+ indent (str | int): The indentation character (default: '\t')
153
+ Returns:
154
+ JsonFile: The object with the encoder set
155
+ """
156
+ if max_level is None:
157
+ obj.encoder = lambda x: super_json_dump(x, indent=indent)
158
+ else:
159
+ obj.encoder = lambda x: super_json_dump(x, max_level=max_level, indent=indent)
160
+ return obj
161
+
@@ -10,6 +10,8 @@ from stouputils.decorators import handle_error, measure_time
10
10
  from stouputils.parallel import multithreading
11
11
  from stouputils.print import progress
12
12
 
13
+ from ..initialize.source_lore_font import find_pack_png
14
+
13
15
 
14
16
  def get_consistent_timestamp(ctx: Context) -> tuple[int, ...]:
15
17
  """ Get a consistent timestamp for archive files based on beet cache .gitignore file modification time. """
@@ -79,6 +81,16 @@ def beet_default(ctx: Context) -> None:
79
81
  for item in temp_zip.filelist:
80
82
  temp_contents[item.filename] = temp_zip.read(item.filename)
81
83
 
84
+ # Check if pack.png exists and prepare it
85
+ pack_png_path = find_pack_png()
86
+ if pack_png_path:
87
+ # Remove pack.png from temp_contents if it exists to avoid duplicates
88
+ temp_contents.pop("pack.png", None)
89
+
90
+ # Read pack.png content
91
+ with open(pack_png_path, "rb") as f:
92
+ temp_contents["pack.png"] = f.read()
93
+
82
94
  # Recreate the zip file with proper timestamps and compression
83
95
  with zipfile.ZipFile(archive_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=6) as final_zip:
84
96
  for filename, content in temp_contents.items():
@@ -0,0 +1,30 @@
1
+
2
+ # Imports
3
+ from beet import Context, PngFile
4
+ from stouputils.decorators import measure_time
5
+ from stouputils.print import progress
6
+
7
+ from ....core import Mem
8
+ from ...initialize.source_lore_font import create_source_lore_font, find_pack_png
9
+
10
+
11
+ # Main entry point
12
+ @measure_time(progress, message="Execution time of 'stewbeet.plugins.finalyze.last_final'")
13
+ def beet_default(ctx: Context):
14
+
15
+ # If source lore is present and there are item definitions using it, create the source lore font
16
+ src_lore: str = Mem.ctx.meta.stewbeet.get("pack_icon_path", "")
17
+ if src_lore and Mem.ctx.meta.stewbeet.source_lore and any(
18
+ Mem.ctx.meta.stewbeet.source_lore in data.get("lore", [])
19
+ for data in Mem.definitions.values()
20
+ ):
21
+ create_source_lore_font(src_lore)
22
+
23
+ # Add the pack icon to the output directory for datapack and resource pack
24
+ pack_icon = find_pack_png()
25
+ if pack_icon:
26
+ Mem.ctx.data.extra["pack.png"] = PngFile(source_path=pack_icon)
27
+ all_assets = set(Mem.ctx.assets.all())
28
+ if len(all_assets) > 0:
29
+ Mem.ctx.assets.extra["pack.png"] = PngFile(source_path=pack_icon)
30
+
@@ -1,124 +1,109 @@
1
-
2
- # Imports
3
- import os
4
- from pathlib import Path
5
-
6
- from beet import Context, Pack, PngFile
7
- from beet.core.utils import JsonDict, TextComponent
8
- from box import Box
9
- from stouputils import relative_path
10
- from stouputils.decorators import measure_time
11
- from stouputils.io import super_json_dump
12
- from stouputils.print import warning
13
-
14
- from ...core import Mem
15
- from .source_lore_font import create_source_lore_font, find_pack_png, prepare_source_lore_font
16
-
17
-
18
- # Main entry point
19
- @measure_time(message="Total execution time", is_generator=True)
20
- def beet_default(ctx: Context):
21
-
22
- # Assertions
23
- assert ctx.project_id, "Project ID must be set in the project configuration."
24
-
25
- # Store the Box object in ctx for access throughout the codebase
26
- meta_box: Box = Box(ctx.meta, default_box=True, default_box_attr={})
27
- object.__setattr__(ctx, "meta", meta_box) # Bypass FrozenInstanceError
28
- Mem.ctx = ctx
29
-
30
- # Preprocess project description
31
- project_description: TextComponent = Mem.ctx.meta.stewbeet.project_description
32
- if not project_description or project_description == "auto":
33
- # Use project name, version, and author to create a default description
34
- Mem.ctx.meta.stewbeet.project_description = f"{ctx.project_name} [{ctx.project_version}] by {ctx.project_author}"
35
-
36
- # Preprocess source lore
37
- source_lore: TextComponent = Mem.ctx.meta.stewbeet.source_lore
38
- if not source_lore or source_lore == "auto":
39
- Mem.ctx.meta.stewbeet.source_lore = [{"text":"ICON"},{"text":f" {ctx.project_name}","italic":True,"color":"blue"}]
40
- src_lore: str = prepare_source_lore_font(Mem.ctx.meta.stewbeet.source_lore)
41
-
42
- # Preprocess manual name
43
- manual_name: TextComponent = Mem.ctx.meta.stewbeet.manual.name
44
- if not manual_name:
45
- Mem.ctx.meta.stewbeet.manual.name = f"{ctx.project_name} Manual"
46
-
47
- # Convert paths to relative ones
48
- object.__setattr__(ctx, "output_directory", relative_path(Mem.ctx.output_directory))
49
-
50
- # Helper function to setup pack.mcmeta
51
- def setup_pack_mcmeta(pack: Pack, pack_format: int):
52
- existing_mcmeta = pack.mcmeta.data or {}
53
- pack_mcmeta: JsonDict = {"pack": {}}
54
- pack_mcmeta.update(existing_mcmeta)
55
- pack_mcmeta["pack"].update(existing_mcmeta.get("pack", {}))
56
- pack_mcmeta["pack"]["pack_format"] = pack_format
57
- pack_mcmeta["pack"]["description"] = Mem.ctx.meta.stewbeet.project_description
58
- pack_mcmeta["id"] = Mem.ctx.project_id
59
- pack.mcmeta.data = pack_mcmeta
60
- pack.mcmeta.encoder = super_json_dump
61
-
62
- # Setup pack.mcmeta for both packs
63
- setup_pack_mcmeta(ctx.data, ctx.data.pack_format)
64
- setup_pack_mcmeta(ctx.assets, ctx.assets.pack_format)
65
-
66
- # Convert texture names if needed (from old legacy system)
67
- textures_folder = Mem.ctx.meta.stewbeet.get("textures_folder")
68
- if textures_folder and Path(textures_folder).exists():
69
- REPLACEMENTS = {
70
- "_off": "",
71
- "_down": "_bottom",
72
- "_up": "_top",
73
- "_north": "_front",
74
- "_south": "_back",
75
- "_west": "_left",
76
- "_east": "_right",
77
- }
78
-
79
- # Get all texture files
80
- texture_files = [f for f in os.listdir(textures_folder) if f.endswith(('.png', '.jpg', '.jpeg', ".mcmeta"))]
81
-
82
- for file in texture_files:
83
- new_name = file.lower()
84
- for k, v in REPLACEMENTS.items():
85
- if k in file:
86
- new_name = new_name.replace(k, v)
87
-
88
- if new_name != file:
89
- old_path = Path(textures_folder) / file
90
- new_path = Path(textures_folder) / new_name
91
- if old_path.exists() and not new_path.exists():
92
- os.rename(old_path, new_path)
93
- warning(f"Renamed texture '{file}' to '{new_name}'")
94
-
95
- # Add missing pack format registries if not present
96
- ctx.data.pack_format_registry.update({
97
- (1, 21, 5): 71,
98
- (1, 21, 6): 80,
99
- (1, 21, 7): 81,
100
- })
101
- ctx.assets.pack_format_registry.update({
102
- (1, 21, 5): 55,
103
- (1, 21, 6): 63,
104
- (1, 21, 7): 64,
105
- })
106
-
107
- # Yield message to indicate successful build
108
- yield
109
-
110
- # If source lore is present and there are item definitions using it, create the source lore font
111
- if src_lore and Mem.ctx.meta.stewbeet.source_lore and any(
112
- Mem.ctx.meta.stewbeet.source_lore in data.get("lore", [])
113
- for data in Mem.definitions.values()
114
- ):
115
- create_source_lore_font(src_lore)
116
-
117
- # Add the pack icon to the output directory for datapack and resource pack
118
- pack_icon = find_pack_png()
119
- if pack_icon:
120
- Mem.ctx.data.extra["pack.png"] = PngFile(source_path=pack_icon)
121
- all_assets = set(Mem.ctx.assets.all())
122
- if len(all_assets) > 0:
123
- Mem.ctx.assets.extra["pack.png"] = PngFile(source_path=pack_icon)
124
-
1
+
2
+ # Imports
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from beet import Context, Pack
7
+ from beet.core.utils import JsonDict, TextComponent
8
+ from box import Box
9
+ from stouputils import relative_path
10
+ from stouputils.decorators import measure_time
11
+ from stouputils.io import super_json_dump
12
+ from stouputils.print import warning
13
+
14
+ from ...core import Mem
15
+ from .source_lore_font import prepare_source_lore_font
16
+
17
+
18
+ # Main entry point
19
+ @measure_time(message="Total execution time", is_generator=True)
20
+ def beet_default(ctx: Context):
21
+
22
+ # Assertions
23
+ assert ctx.project_id, "Project ID must be set in the project configuration."
24
+
25
+ # Store the Box object in ctx for access throughout the codebase
26
+ meta_box: Box = Box(ctx.meta, default_box=True, default_box_attr={})
27
+ object.__setattr__(ctx, "meta", meta_box) # Bypass FrozenInstanceError
28
+ Mem.ctx = ctx
29
+
30
+ # Preprocess project description
31
+ project_description: TextComponent = Mem.ctx.meta.stewbeet.project_description
32
+ if not project_description or project_description == "auto":
33
+ # Use project name, version, and author to create a default description
34
+ Mem.ctx.meta.stewbeet.project_description = f"{ctx.project_name} [{ctx.project_version}] by {ctx.project_author}"
35
+
36
+ # Preprocess source lore
37
+ source_lore: TextComponent = Mem.ctx.meta.stewbeet.source_lore
38
+ if not source_lore or source_lore == "auto":
39
+ Mem.ctx.meta.stewbeet.source_lore = [{"text":"ICON"},{"text":f" {ctx.project_name}","italic":True,"color":"blue"}]
40
+ Mem.ctx.meta.stewbeet["pack_icon_path"] = prepare_source_lore_font(Mem.ctx.meta.stewbeet.source_lore)
41
+
42
+ # Preprocess manual name
43
+ manual_name: TextComponent = Mem.ctx.meta.stewbeet.manual.name
44
+ if not manual_name:
45
+ Mem.ctx.meta.stewbeet.manual.name = f"{ctx.project_name} Manual"
46
+
47
+ # Convert paths to relative ones
48
+ object.__setattr__(ctx, "output_directory", relative_path(Mem.ctx.output_directory))
49
+
50
+ # Helper function to setup pack.mcmeta
51
+ def setup_pack_mcmeta(pack: Pack, pack_format: int):
52
+ existing_mcmeta = pack.mcmeta.data or {}
53
+ pack_mcmeta: JsonDict = {"pack": {}}
54
+ pack_mcmeta.update(existing_mcmeta)
55
+ pack_mcmeta["pack"].update(existing_mcmeta.get("pack", {}))
56
+ pack_mcmeta["pack"]["pack_format"] = pack_format
57
+ pack_mcmeta["pack"]["description"] = Mem.ctx.meta.stewbeet.project_description
58
+ pack_mcmeta["id"] = Mem.ctx.project_id
59
+ pack.mcmeta.data = pack_mcmeta
60
+ pack.mcmeta.encoder = super_json_dump
61
+
62
+ # Setup pack.mcmeta for both packs
63
+ setup_pack_mcmeta(ctx.data, ctx.data.pack_format)
64
+ setup_pack_mcmeta(ctx.assets, ctx.assets.pack_format)
65
+
66
+ # Convert texture names if needed (from old legacy system)
67
+ textures_folder = Mem.ctx.meta.stewbeet.get("textures_folder")
68
+ if textures_folder and Path(textures_folder).exists():
69
+ REPLACEMENTS = {
70
+ "_off": "",
71
+ "_down": "_bottom",
72
+ "_up": "_top",
73
+ "_north": "_front",
74
+ "_south": "_back",
75
+ "_west": "_left",
76
+ "_east": "_right",
77
+ }
78
+
79
+ # Get all texture files
80
+ texture_files = [f for f in os.listdir(textures_folder) if f.endswith(('.png', '.jpg', '.jpeg', ".mcmeta"))]
81
+
82
+ for file in texture_files:
83
+ new_name = file.lower()
84
+ for k, v in REPLACEMENTS.items():
85
+ if k in file:
86
+ new_name = new_name.replace(k, v)
87
+
88
+ if new_name != file:
89
+ old_path = Path(textures_folder) / file
90
+ new_path = Path(textures_folder) / new_name
91
+ if old_path.exists() and not new_path.exists():
92
+ os.rename(old_path, new_path)
93
+ warning(f"Renamed texture '{file}' to '{new_name}'")
94
+
95
+ # Add missing pack format registries if not present
96
+ ctx.data.pack_format_registry.update({
97
+ (1, 21, 5): 71,
98
+ (1, 21, 6): 80,
99
+ (1, 21, 7): 81,
100
+ })
101
+ ctx.assets.pack_format_registry.update({
102
+ (1, 21, 5): 55,
103
+ (1, 21, 6): 63,
104
+ (1, 21, 7): 64,
105
+ })
106
+
107
+ # Yield message to indicate successful build
108
+ yield
109
+
@@ -63,3 +63,10 @@ def create_source_lore_font(pack_icon: str) -> None:
63
63
  image = image.resize((256, 256))
64
64
  Mem.ctx.assets[Mem.ctx.project_id].textures["font/original_icon"] = Texture(image)
65
65
 
66
+ def delete_source_lore_font() -> None:
67
+ """ Delete the source lore font if it exists. """
68
+ if Mem.ctx.assets[Mem.ctx.project_id].fonts.get("icons"):
69
+ del Mem.ctx.assets[Mem.ctx.project_id].fonts["icons"]
70
+ if Mem.ctx.assets[Mem.ctx.project_id].textures.get("font/original_icon"):
71
+ del Mem.ctx.assets[Mem.ctx.project_id].textures["font/original_icon"]
72
+