stewbeet 2.2.22__tar.gz → 2.2.23__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 (256) hide show
  1. {stewbeet-2.2.22 → stewbeet-2.2.23}/PKG-INFO +2 -2
  2. {stewbeet-2.2.22 → stewbeet-2.2.23}/pyproject.toml +2 -2
  3. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/constants.py +1 -0
  4. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/materials.py +54 -52
  5. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/ingredients.py +58 -9
  6. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  7. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/__init__.py +3 -1
  8. stewbeet-2.2.23/stewbeet/plugins/custom_recipes/awakened_forge.py +174 -0
  9. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_1.png +0 -0
  10. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_2.png +0 -0
  11. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x3.png +0 -0
  12. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x4.png +0 -0
  13. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/craft_content.py +123 -1
  14. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/dialog.py +11 -4
  15. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/iso_renders.py +2 -2
  16. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/main.py +51 -11
  17. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/other_utils.py +20 -3
  18. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/page_font.py +10 -9
  19. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/shared_import.py +7 -0
  20. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/stardust_forge.py +32 -0
  21. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/1book.png +0 -0
  22. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_1.png +0 -0
  23. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_2.png +0 -0
  24. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x3.png +0 -0
  25. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x4.png +0 -0
  26. stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/donut_holer.png +0 -0
  27. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/item_models/object.py +6 -2
  28. {stewbeet-2.2.22 → stewbeet-2.2.23}/.gitignore +0 -0
  29. {stewbeet-2.2.22 → stewbeet-2.2.23}/LICENSE +0 -0
  30. {stewbeet-2.2.22 → stewbeet-2.2.23}/README.md +0 -0
  31. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/__init__.py +0 -0
  32. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/__main__.py +0 -0
  33. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/all.py +0 -0
  34. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/cli.py +0 -0
  35. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/__init__.py +0 -0
  36. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  37. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/github.py +0 -0
  38. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/modrinth.py +0 -0
  39. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/pmc.py +0 -0
  40. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/continuous_delivery/smithed.py +0 -0
  41. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  42. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  43. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  44. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/cables.py +0 -0
  45. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  46. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  47. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  48. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  49. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  50. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  51. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  52. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  53. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  54. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  55. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  56. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  57. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  58. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  59. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  60. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  61. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  62. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  63. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  64. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  65. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  66. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  67. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  68. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  69. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  70. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  71. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  72. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  73. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  74. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  75. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  76. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  77. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  78. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  79. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  80. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  81. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  82. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  83. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  84. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  85. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  86. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  87. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  88. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  89. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  90. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  91. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  92. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  93. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  94. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  95. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  96. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  97. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  98. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  99. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  100. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  101. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  102. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  103. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  104. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  105. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  106. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  107. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  108. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  109. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  110. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/gui.py +0 -0
  111. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  112. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  113. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/py.typed +0 -0
  114. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
  115. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
  116. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
  117. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
  118. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
  119. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
  120. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
  121. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
  122. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  123. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/__init__.py +0 -0
  124. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/__memory__.py +0 -0
  125. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/__init__.py +0 -0
  126. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/completion.py +0 -0
  127. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/equipments.py +0 -0
  128. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/records.py +0 -0
  129. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
  130. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  131. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/text.py +0 -0
  132. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/utils/io.py +0 -0
  133. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/core/utils/sounds.py +0 -0
  134. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/__init__.py +0 -0
  135. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/bookshelf.py +0 -0
  136. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/bookshelf_config.json +0 -0
  137. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  138. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  139. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  140. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  141. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  142. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  143. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  144. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  145. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  146. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  147. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  148. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  149. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  150. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  151. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  152. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  153. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  154. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  155. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  156. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  157. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  158. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  159. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  160. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  161. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  162. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  163. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  164. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  165. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  166. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  167. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  168. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  169. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/archive/__init__.py +0 -0
  170. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  171. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
  172. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
  173. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
  174. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/object.py +0 -0
  175. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  176. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  177. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  178. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  179. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  180. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  181. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_paintings/__init__.py +0 -0
  182. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  183. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  184. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  185. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  186. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  187. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  188. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  189. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
  190. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
  191. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
  192. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/match.py +0 -0
  193. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
  194. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
  195. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
  196. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  197. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  198. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  199. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  200. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  201. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  202. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/book.png +0 -0
  203. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  204. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  205. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  206. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  207. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  208. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
  209. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  210. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  211. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  212. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  213. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  214. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  215. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
  216. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  217. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  218. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  219. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
  220. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  221. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
  222. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  223. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
  224. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
  225. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  226. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  227. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/book.png +0 -0
  228. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  229. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  230. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  231. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  232. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  233. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
  234. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  235. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  236. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  237. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  238. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  239. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  240. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
  241. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  242. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  243. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  244. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
  245. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  246. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  247. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/initialize/__init__.py +0 -0
  248. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  249. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  250. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  251. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  252. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  253. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  254. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
  255. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/py.typed +0 -0
  256. {stewbeet-2.2.22 → stewbeet-2.2.23}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.2.22
3
+ Version: 2.2.23
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
@@ -14,7 +14,7 @@ Requires-Python: >=3.12
14
14
  Requires-Dist: beet>=0.112.0
15
15
  Requires-Dist: bolt>=0.49.2
16
16
  Requires-Dist: mecha>=0.99.0
17
- Requires-Dist: model-resolver>=1.11.1
17
+ Requires-Dist: model-resolver>=1.11.2
18
18
  Requires-Dist: mutagen>=1.47.0
19
19
  Requires-Dist: pyperclip>=1.8.0
20
20
  Requires-Dist: smithed>=0.19.0
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stewbeet"
8
- version = "2.2.22"
8
+ version = "2.2.23"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -17,7 +17,7 @@ classifiers = [
17
17
  ]
18
18
  dependencies = [
19
19
  "stouputils>=1.4.1",
20
- "model_resolver>=1.11.1",
20
+ "model_resolver>=1.11.2",
21
21
  "beet>=0.112.0",
22
22
  "bolt>=0.49.2",
23
23
  "mecha>=0.99.0",
@@ -66,6 +66,7 @@ NO_SILK_TOUCH_DROP: str = "no_silk_touch_drop" # Key to an item ID that will d
66
66
  VANILLA_BLOCK_FOR_ORES: JsonDict = {"id":"minecraft:polished_deepslate", "apply_facing": False} # Vanilla block that will be used for an optimization tip for ores, don't ask questions
67
67
  OVERRIDE_MODEL: str = "override_model" # Key to a dictionnary that will be used to override the whole model
68
68
  PULVERIZING: str = "simplenergy_pulverizing" # Value of a recipe type, used to generate dusts from ores (used by SimplEnergy)
69
+ AWAKENED_FORGE: str = "stardust_awakened_forge" # Value of a recipe type, used to craft items in the Awakened Forge (used by Stardust Fragment)
69
70
  SMITHED_CRAFTER_COMMAND: str = "smithed_crafter_command" # Key to a command that will be used in a recipe in the Smithed Crafter library. If not present, the command will be defaulted to a loot table. Ex: {"result":...,SMITHED_CRAFTER_COMMAND: "function your_namespace:calls/smithed_crafter/do_something_else"}
70
71
  PAINTING_DATA: str = "painting_data" # Key to a dict that contains the painting data, like {"author":"","title":"","width":1,"height":1} where author and title defaults to beet config values if not given
71
72
  GROWING_SEED: str = "staged_seed" # Key to a seed that has multiple growth stages, value needs to be a dict like {"texture_basename":"wheat","stages":8,"seconds":600,"planted_on":"stone","loots":[{"id":"minecraft:wheat_seeds","min_count":1,"max_count":3}]} where loots can be either this format or a loot table path "namespace:blocks/loot_table_name"
@@ -54,7 +54,60 @@ def generate_everything_about_this_material(
54
54
  material_base = material.split(":")[-1] # Get the base material name (ex: "adamantium" from "adamantium_fragment")
55
55
  main_ingredient = ingr_repr(material, Mem.ctx.project_id) # Get the main ingredient for recipes
56
56
 
57
- # Placeables (ore, deepslate_ore, block, raw_block)
57
+
58
+ ## Ingredients (ingot, nugget, raw, and other)
59
+ for item in [material_base, f"{material_base}_fragment", f"{material_base}_ingot", f"{material_base}_nugget", f"raw_{material_base}", f"{material_base}_dust", f"{material_base}_stick", f"{material_base}_rod"]:
60
+ if item + ".png" not in textures:
61
+ continue
62
+ if item not in Mem.definitions:
63
+ Mem.definitions[item] = {}
64
+ item_type = item.replace(f"{material_base}_", "").replace(f"_{material_base}", "")
65
+ Mem.definitions[item]["id"] = CUSTOM_ITEM_VANILLA # Custom item
66
+ Mem.definitions[item][CATEGORY] = "material" # Category
67
+ Mem.definitions[item]["custom_data"] = {"smithed":{}} # Smithed convention
68
+ Mem.definitions[item]["custom_data"]["smithed"]["dict"] = {item_type: {material_base: True}}
69
+
70
+ # Recipes
71
+ if not ignore_recipes:
72
+ Mem.definitions[item][RESULT_OF_CRAFTING] = Mem.definitions[item].get(RESULT_OF_CRAFTING, [])
73
+ Mem.definitions[item][USED_FOR_CRAFTING] = Mem.definitions[item].get(USED_FOR_CRAFTING, [])
74
+ if item.endswith("ingot") or item.endswith("fragment") or item == material_base:
75
+ if f"{material_base}_block.png" in textures:
76
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[ingr_repr(f"{material_base}_block", Mem.ctx.project_id)]})
77
+ if f"{material_base}_nugget.png" in textures:
78
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","group":material_base,"shape":["XXX","XXX","XXX"],"ingredients":{"X":ingr_repr(f"{material_base}_nugget", Mem.ctx.project_id)}})
79
+ if f"raw_{material_base}.png" in textures:
80
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
81
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
82
+ if f"{material_base}_dust.png" in textures:
83
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
84
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
85
+ if f"{material_base}_ore.png" in textures:
86
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
87
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
88
+ if f"deepslate_{material_base}_ore.png" in textures:
89
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
90
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
91
+ if item.endswith("dust"):
92
+ Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
93
+ Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
94
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":1,"category":"misc","group":material_base,"ingredient":main_ingredient})
95
+ for pulv_ingr in [f"raw_{material_base}",f"{material_base}_ore",f"deepslate_{material_base}_ore"]:
96
+ if f"{pulv_ingr}.png" in textures:
97
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":2,"category":"misc","group":material_base,"ingredient":ingr_repr(pulv_ingr, Mem.ctx.project_id)})
98
+ if item.endswith("nugget"):
99
+ Mem.definitions[item][RESULT_OF_CRAFTING].insert(0, {"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[main_ingredient]})
100
+ for gear in SLOTS.keys():
101
+ if f"{material_base}_{gear}.png" in textures:
102
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"equipment","experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_{gear}", Mem.ctx.project_id)})
103
+ if item.endswith("stick"):
104
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":4,"category":"misc","shape":["X","X"],"ingredients":{"X":main_ingredient}})
105
+ if item.endswith("rod"):
106
+ Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","shape":["X","X","X"],"ingredients":{"X":main_ingredient}})
107
+ pass
108
+
109
+
110
+ ## Placeables (ore, deepslate_ore, block, raw_block)
58
111
  for block in [f"{material_base}_block", f"{material_base}_ore", f"deepslate_{material_base}_ore", f"raw_{material_base}_block"]:
59
112
  if block + ".png" not in textures:
60
113
  continue
@@ -216,57 +269,6 @@ def generate_everything_about_this_material(
216
269
  Mem.definitions[tool]["attribute_modifiers"] = [am for am in Mem.definitions[tool]["attribute_modifiers"] if am["type"] != "mining_efficiency"]
217
270
  pass
218
271
 
219
- ## Ingredients (ingot, nugget, raw, and other)
220
- for item in [material_base, f"{material_base}_ingot", f"{material_base}_nugget", f"raw_{material_base}", f"{material_base}_fragment", f"{material_base}_dust", f"{material_base}_stick", f"{material_base}_rod"]:
221
- if item + ".png" not in textures:
222
- continue
223
- if item not in Mem.definitions:
224
- Mem.definitions[item] = {}
225
- item_type = item.replace(f"{material_base}_", "").replace(f"_{material_base}", "")
226
- Mem.definitions[item]["id"] = CUSTOM_ITEM_VANILLA # Custom item
227
- Mem.definitions[item][CATEGORY] = "material" # Category
228
- Mem.definitions[item]["custom_data"] = {"smithed":{}} # Smithed convention
229
- Mem.definitions[item]["custom_data"]["smithed"]["dict"] = {item_type: {material_base: True}}
230
-
231
- # Recipes
232
- if not ignore_recipes:
233
- Mem.definitions[item][RESULT_OF_CRAFTING] = Mem.definitions[item].get(RESULT_OF_CRAFTING, [])
234
- Mem.definitions[item][USED_FOR_CRAFTING] = Mem.definitions[item].get(USED_FOR_CRAFTING, [])
235
- if item.endswith("ingot") or item.endswith("fragment") or item == material_base:
236
- if f"{material_base}_block.png" in textures:
237
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[ingr_repr(f"{material_base}_block", Mem.ctx.project_id)]})
238
- if f"{material_base}_nugget.png" in textures:
239
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","group":material_base,"shape":["XXX","XXX","XXX"],"ingredients":{"X":ingr_repr(f"{material_base}_nugget", Mem.ctx.project_id)}})
240
- if f"raw_{material_base}.png" in textures:
241
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
242
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
243
- if f"{material_base}_dust.png" in textures:
244
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
245
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
246
- if f"{material_base}_ore.png" in textures:
247
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
248
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
249
- if f"deepslate_{material_base}_ore.png" in textures:
250
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
251
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
252
- if item.endswith("dust"):
253
- Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
254
- Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
255
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":1,"category":"misc","group":material_base,"ingredient":main_ingredient})
256
- for pulv_ingr in [f"raw_{material_base}",f"{material_base}_ore",f"deepslate_{material_base}_ore"]:
257
- if f"{pulv_ingr}.png" in textures:
258
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":2,"category":"misc","group":material_base,"ingredient":ingr_repr(pulv_ingr, Mem.ctx.project_id)})
259
- if item.endswith("nugget"):
260
- Mem.definitions[item][RESULT_OF_CRAFTING].insert(0, {"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[main_ingredient]})
261
- for gear in SLOTS.keys():
262
- if f"{material_base}_{gear}.png" in textures:
263
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"equipment","experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_{gear}", Mem.ctx.project_id)})
264
- if item.endswith("stick"):
265
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":4,"category":"misc","shape":["X","X"],"ingredients":{"X":main_ingredient}})
266
- if item.endswith("rod"):
267
- Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","shape":["X","X","X"],"ingredients":{"X":main_ingredient}})
268
- pass
269
-
270
272
 
271
273
  # Generate everything about these ores
272
274
  def generate_everything_about_these_materials(ores: dict[str, EquipmentsConfig|None], ignore_recipes: bool = False) -> None:
@@ -3,13 +3,13 @@
3
3
  from typing import Any, cast
4
4
 
5
5
  from beet import LootTable
6
- from beet.core.utils import JsonDict
6
+ from beet.core.utils import JsonDict, TextComponent
7
7
  from stouputils.decorators import simple_cache
8
8
  from stouputils.io import super_json_dump
9
9
  from stouputils.print import error
10
10
 
11
11
  from .__memory__ import Mem
12
- from .constants import NOT_COMPONENTS, PULVERIZING
12
+ from .constants import AWAKENED_FORGE, NOT_COMPONENTS, PULVERIZING
13
13
 
14
14
  # Recipes constants
15
15
  FURNACES_RECIPES_TYPES: tuple[str, ...] = ("smelting", "blasting", "smoking", "campfire_cooking")
@@ -22,17 +22,17 @@ UNUSED_RECIPES_TYPES: tuple[str, ...] = (
22
22
  "crafting_special_repairitem", "crafting_special_shielddecoration", "crafting_special_tippedarrow",
23
23
  "crafting_transmute",
24
24
  )
25
- SPECIAL_RECIPES_TYPES: tuple[str, ...] = (PULVERIZING, )
25
+ SPECIAL_RECIPES_TYPES: tuple[str, ...] = (PULVERIZING, AWAKENED_FORGE)
26
26
  ALL_RECIPES_TYPES: tuple[str, ...] = (*FURNACES_RECIPES_TYPES, *CRAFTING_RECIPES_TYPES, *OTHER_RECIPES_TYPES, *UNUSED_RECIPES_TYPES, *SPECIAL_RECIPES_TYPES)
27
27
 
28
28
  # Function mainly used for definitions generation
29
- @simple_cache
29
+ @simple_cache()
30
30
  def ingr_repr(id: str, ns: str|None = None, count: int|None = None) -> JsonDict:
31
31
  """ Get the identity of the ingredient from its id for custom crafts
32
32
  Args:
33
33
  id (str): The id of the ingredient, ex: adamantium_fragment
34
34
  ns (str|None): The namespace of the ingredient (optional if 'id' argument is a vanilla item), ex: iyc
35
- count (int|None): The count of the ingredient (optional, used only when this ingredient format is a result item)
35
+ count (int|None): The count of the ingredient (optional, used only when this ingredient format is a result item) (or use a special type of recipe that supports counts)
36
36
  Returns:
37
37
  str: The identity of the ingredient for custom crafts,
38
38
  ex: {"components":{"minecraft:custom_data":{"iyc":{"adamantium_fragment":True}}}}
@@ -67,13 +67,14 @@ def item_to_id_ingr_repr(ingr: JsonDict) -> JsonDict:
67
67
  return r
68
68
 
69
69
  # Mainly used for manual
70
- @simple_cache
70
+ @simple_cache()
71
71
  def ingr_to_id(ingredient: JsonDict, add_namespace: bool = True) -> str:
72
72
  """ Get the id from an ingredient dict
73
73
  Args:
74
74
  ingredient (dict): The ingredient dict
75
75
  ex: {"components":{"minecraft:custom_data":{iyc:{adamantium_ingot:True}}}}
76
76
  ex: {"item": "minecraft:stick"}
77
+ add_namespace (bool): Whether to add the namespace to the id
77
78
  Returns:
78
79
  str: The id of the ingredient, ex: "minecraft:stick" or "iyc:adamantium_ingot"
79
80
  """
@@ -104,8 +105,56 @@ def ingr_to_id(ingredient: JsonDict, add_namespace: bool = True) -> str:
104
105
  return namespace + ":" + id
105
106
  return id
106
107
 
108
+ @simple_cache()
109
+ def text_component_to_str(tc: TextComponent) -> str:
110
+ """ Convert a TextComponent to a string
111
+ Args:
112
+ tc (TextComponent): The TextComponent to convert
113
+ Returns:
114
+ str: The converted string
115
+ """
116
+ if isinstance(tc, str):
117
+ return tc
118
+ elif isinstance(tc, list):
119
+ result: str = ""
120
+ for part in tc:
121
+ result += text_component_to_str(part)
122
+ return result
123
+ result: str = ""
124
+ if tc.get("text"):
125
+ result += tc["text"]
126
+ if tc.get("extra"):
127
+ for extra in tc["extra"]:
128
+ result += text_component_to_str(extra)
129
+ return result
130
+
131
+ @simple_cache()
132
+ def ingr_to_name(ingredient: JsonDict) -> str:
133
+ """ Get the name from an ingredient dict
134
+ Args:
135
+ ingredient (dict): The ingredient dict
136
+ ex: {"components":{"minecraft:custom_data":{iyc:{adamantium_ingot:True}}}}
137
+ ex: {"item": "minecraft:stick"}
138
+ Returns:
139
+ str: The name of the ingredient, ex: "Stick" or "Adamantium Ingot"
140
+ """
141
+ # Internal definitions
142
+ id = ingr_to_id(ingredient, add_namespace=False)
143
+ for component in ("item_name", "custom_name"):
144
+ if Mem.definitions.get(id, {}).get(component):
145
+ return text_component_to_str(Mem.definitions[id][component])
146
+
147
+ # External definitions
148
+ external_id = ingr_to_id(ingredient, add_namespace=True)
149
+ for component in ("item_name", "custom_name"):
150
+ if Mem.external_definitions.get(external_id, {}).get(component):
151
+ return text_component_to_str(Mem.external_definitions[external_id][component])
152
+
153
+ # Default: prettify the id
154
+ return id.replace("_", " ").title()
155
+
107
156
  # Mainly used for recipes
108
- @simple_cache
157
+ @simple_cache()
109
158
  def get_vanilla_item_id_from_ingredient(ingredient: JsonDict, add_namespace: bool = True) -> str:
110
159
  """ Get the id of the vanilla item from an ingredient dict
111
160
  Args:
@@ -185,7 +234,7 @@ def get_item_from_ingredient(ingredient: JsonDict) -> JsonDict:
185
234
 
186
235
 
187
236
  # Make a loot table
188
- @simple_cache
237
+ @simple_cache()
189
238
  def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int | dict) -> str:
190
239
  """ Get the loot table for an ingredient dict
191
240
  Args:
@@ -233,7 +282,7 @@ def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int |
233
282
  Mem.ctx.data[loot_table] = LootTable(super_json_dump(file, max_level=9))
234
283
  return loot_table
235
284
 
236
- @simple_cache
285
+ @simple_cache()
237
286
  def get_ingredients_from_recipe(recipe: JsonDict) -> list[str]:
238
287
  """ Get the ingredients from a recipe dict
239
288
  Args:
@@ -5,6 +5,7 @@ from stouputils.decorators import measure_time
5
5
  from stouputils.print import progress
6
6
 
7
7
  from ...core.__memory__ import Mem
8
+ from .awakened_forge import AwakenedForgeRecipeHandler
8
9
  from .furnace import FurnaceRecipeHandler
9
10
  from .pulverizer import PulverizerRecipeHandler
10
11
  from .smithed import SmithedRecipeHandler
@@ -28,6 +29,7 @@ def beet_default(ctx: Context) -> None:
28
29
  # Do all the things
29
30
  VanillaRecipeHandler.routine()
30
31
  SmithedRecipeHandler.routine()
31
- PulverizerRecipeHandler.routine()
32
32
  FurnaceRecipeHandler.routine()
33
+ PulverizerRecipeHandler.routine()
34
+ AwakenedForgeRecipeHandler.routine()
33
35
 
@@ -0,0 +1,174 @@
1
+
2
+ # Imports
3
+ import json
4
+
5
+ from beet import Predicate
6
+ from beet.core.utils import JsonDict
7
+ from stouputils.decorators import simple_cache
8
+
9
+ from ...core.__memory__ import Mem
10
+ from ...core.constants import AWAKENED_FORGE
11
+ from ...core.ingredients import (
12
+ get_item_from_ingredient,
13
+ ingr_repr,
14
+ ingr_to_id,
15
+ item_to_id_ingr_repr,
16
+ loot_table_from_ingredient,
17
+ )
18
+ from ...core.utils.io import set_json_encoder, write_function, write_load_file, write_versioned_function
19
+
20
+
21
+ class AwakenedForgeRecipeHandler:
22
+ """ Handler for awakened forge recipe generation.
23
+
24
+ This class handles the generation of awakened forge recipes.
25
+ """
26
+ def __init__(self) -> None:
27
+ """ Initialize the handler. """
28
+ self.STARDUST_AWAKENED_FORGE_PATH: str = f"{Mem.ctx.project_id}:calls/stardust/awakened_forge_recipes"
29
+
30
+ @classmethod
31
+ def routine(cls) -> None:
32
+ """ Main routine for awakened forge recipe generation. """
33
+ handler = cls()
34
+ handler.generate_recipes()
35
+
36
+ @simple_cache()
37
+ def stardust_awakened_forge_recipe(self, recipe: JsonDict, item: str) -> str:
38
+ """ Generate a awakened forge recipe.
39
+
40
+ Args:
41
+ recipe (JsonDict): The recipe data.
42
+ item (str): The item to generate the recipe for.
43
+
44
+ Returns:
45
+ str: The generated recipe command.
46
+ """
47
+ # Determine the result
48
+ result: JsonDict = item_to_id_ingr_repr(get_item_from_ingredient(recipe["result"])) if recipe.get("result") else ingr_repr(item, Mem.ctx.project_id)
49
+ result_function: str = ingr_to_id(result, add_namespace=True).replace(":", "/")
50
+
51
+ # Get ingredients
52
+ ingredients: list[JsonDict] = recipe["ingredients"]
53
+ first_ingredient: JsonDict = ingredients[0]
54
+ assert first_ingredient.get("count", 1) <= 64, f"First ingredient must have count <= 64, for {item} recipe {recipe}"
55
+ ingredients = ingredients[1:]
56
+
57
+ # Prepare the check line
58
+ line: str = "execute if data entity @s Item" + json.dumps(item_to_id_ingr_repr(first_ingredient))
59
+ for ingredient in ingredients:
60
+ count: int = ingredient.get("count", 1)
61
+ while True:
62
+ ingredient_copy = ingredient.copy()
63
+ ingredient_copy["count"] = count if count < 64 else 64
64
+ line += f" if entity @n[type=item,nbt={{Item:{json.dumps(item_to_id_ingr_repr(ingredient_copy))}}},distance=..1]"
65
+ count -= 64
66
+ if count <= 0:
67
+ break
68
+ line += f" run return run function {Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/timer"
69
+
70
+ # Write the first result function
71
+ particle: str = recipe.get("particle", r"minecraft:dust{color:[0,0,1],scale:2}")
72
+ write_function(f"{Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/timer", f"""
73
+ # Timer
74
+ scoreboard players add @s stardust.forge_timer 4
75
+ scoreboard players remove @s[scores={{stardust.forge_timer=1..}}] stardust.forge_timer 3
76
+ scoreboard players reset @s[scores={{stardust.forge_timer=..0}}] stardust.forge_timer
77
+ execute if score @s stardust.forge_timer matches 1 run playsound stardust:awakened_forge_crafting ambient @a[distance=..25]
78
+ execute if score @s stardust.forge_timer matches 1.. run particle {particle} ~ ~ ~ 5 5 5 0.1 125
79
+
80
+ # When timer reaches 4, craft the item
81
+ execute if score @s stardust.forge_timer matches 4 run function {Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/craft
82
+ """)
83
+ # Write the second result function
84
+ kill_ingredients: str = ""
85
+ for ingredient in ingredients:
86
+ count: int = ingredient.get("count", 1)
87
+ while True:
88
+ ingredient_copy = ingredient.copy()
89
+ ingredient_copy["count"] = count if count < 64 else 64
90
+ kill_ingredients += f"kill @n[type=item,nbt={{Item:{json.dumps(item_to_id_ingr_repr(ingredient_copy))}}},distance=..1]\n"
91
+ count -= 64
92
+ if count <= 0:
93
+ break
94
+ write_function(f"{Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/craft", f"""
95
+ # Visual and audio feedback
96
+ advancement grant @a[distance=..25] only stardust:visible/adventure/use_awakened_forge
97
+ playsound block.anvil.use block @a[distance=..25]
98
+ particle smoke ~ ~ ~ 0.4 0.4 0.4 0.2 1000
99
+
100
+ # Kill ingredients
101
+ kill @s
102
+ {kill_ingredients}
103
+
104
+ # Spawn result item with Motion [0.0,1.0,0.0]
105
+ tag @e[type=item] add stardust.temp
106
+ execute align xyz run loot spawn ~.5 ~.5 ~.5 loot {loot_table_from_ingredient(result, recipe['result_count'])}
107
+ execute as @e[type=item,tag=!stardust.temp] run data merge entity @s {{Motion:[0.0d,1.0d,0.0d],Glowing:true}}
108
+ tag @e[type=item,tag=stardust.temp] remove stardust.temp
109
+ """)
110
+
111
+ # Return check line
112
+ return line
113
+
114
+ def generate_recipes(self) -> None:
115
+ """ Generate all pulverizer recipes. """
116
+ for item, data in Mem.definitions.items():
117
+ crafts: list[JsonDict] = list(data.get("result_of_crafting", []))
118
+ crafts += list(data.get("used_for_crafting", []))
119
+
120
+ for recipe in crafts:
121
+ if recipe["type"] == AWAKENED_FORGE:
122
+ write_function(
123
+ self.STARDUST_AWAKENED_FORGE_PATH,
124
+ self.stardust_awakened_forge_recipe(recipe, item),
125
+ tags=["stardust:calls/awakened_forge_recipes"],
126
+ )
127
+
128
+ # Second clock function
129
+ if Mem.ctx.project_id == "stardust" and Mem.ctx.data["stardust"].functions.get("calls/stardust/awakened_forge_recipes"):
130
+ write_load_file("# Awakened Forge timer\nscoreboard objectives add stardust.forge_timer dummy")
131
+ write_versioned_function("second", """
132
+ # Awakened Forge recipes
133
+ execute as @e[type=item,predicate=stardust:awakened_forge_input] at @s run function stardust:forge/second
134
+ """)
135
+ Mem.ctx.data["stardust"].predicates["awakened_forge_input"] = set_json_encoder(Predicate({
136
+ "condition": "minecraft:entity_properties",
137
+ "entity": "this",
138
+ "predicate": {
139
+ "nbt": """{Item:{components:{"minecraft:custom_data":{}}}}""",
140
+ "stepping_on": {
141
+ "block": {
142
+ "blocks": "minecraft:glass"
143
+ }
144
+ }
145
+ }
146
+ }), max_level=-1)
147
+
148
+ # Second function, check the structure and call the recipes
149
+ write_function("stardust:forge/second", """
150
+ # Check for Awakened Forge structure
151
+ execute unless function stardust:forge/verify_structure run return fail
152
+
153
+ # Call Awakened Forge recipes
154
+ function #stardust:calls/awakened_forge_recipes
155
+ """)
156
+
157
+ # Check structure function
158
+ write_function("stardust:forge/verify_structure", """
159
+ ## Verify Awakened Forge multiblock structure
160
+ scoreboard players set #success stardust.data 0
161
+
162
+ # Structure Orientation
163
+ execute if block ~-2 ~-2 ~-2 #minecraft:diamond_ores if block ~-2 ~-1 ~-2 #minecraft:iron_ores if block ~2 ~-2 ~-2 #minecraft:emerald_ores if block ~2 ~-1 ~-2 #minecraft:coal_ores if block ~2 ~-2 ~2 nether_quartz_ore if block ~2 ~-1 ~2 #minecraft:redstone_ores if block ~-2 ~-2 ~2 #minecraft:gold_ores if block ~-2 ~-1 ~2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
164
+ execute if block ~2 ~-2 ~2 #minecraft:diamond_ores if block ~2 ~-1 ~2 #minecraft:iron_ores if block ~-2 ~-2 ~2 #minecraft:emerald_ores if block ~-2 ~-1 ~2 #minecraft:coal_ores if block ~-2 ~-2 ~-2 nether_quartz_ore if block ~-2 ~-1 ~-2 #minecraft:redstone_ores if block ~2 ~-2 ~-2 #minecraft:gold_ores if block ~2 ~-1 ~-2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
165
+ execute if block ~2 ~-2 ~-2 #minecraft:diamond_ores if block ~2 ~-1 ~-2 #minecraft:iron_ores if block ~2 ~-2 ~2 #minecraft:emerald_ores if block ~2 ~-1 ~2 #minecraft:coal_ores if block ~-2 ~-2 ~2 nether_quartz_ore if block ~-2 ~-1 ~2 #minecraft:redstone_ores if block ~-2 ~-2 ~-2 #minecraft:gold_ores if block ~-2 ~-1 ~-2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
166
+ execute if block ~-2 ~-2 ~2 #minecraft:diamond_ores if block ~-2 ~-1 ~2 #minecraft:iron_ores if block ~-2 ~-2 ~-2 #minecraft:emerald_ores if block ~-2 ~-1 ~-2 #minecraft:coal_ores if block ~2 ~-2 ~-2 nether_quartz_ore if block ~2 ~-1 ~-2 #minecraft:redstone_ores if block ~2 ~-2 ~2 #minecraft:gold_ores if block ~2 ~-1 ~2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
167
+
168
+ # Continuation of the structure
169
+ execute if score #success stardust.data matches 1 if block ~ ~-1 ~ glass if block ~2 ~ ~2 glass if block ~-2 ~ ~-2 glass if block ~-2 ~ ~2 glass if block ~2 ~ ~-2 glass if block ~ ~-2 ~ diamond_block if block ~1 ~-1 ~1 dragon_egg if block ~-1 ~-1 ~-1 dragon_egg if block ~-1 ~-1 ~1 dragon_egg if block ~1 ~-1 ~-1 dragon_egg if block ~2 ~-2 ~ beacon if block ~ ~-2 ~2 beacon if block ~-2 ~-2 ~ beacon if block ~ ~-2 ~-2 beacon if block ~1 ~-2 ~ red_concrete if block ~-1 ~-2 ~ red_concrete if block ~ ~-2 ~1 red_concrete if block ~ ~-2 ~-1 red_concrete if block ~1 ~-2 ~1 red_concrete if block ~-1 ~-2 ~1 red_concrete if block ~-1 ~-2 ~-1 red_concrete if block ~1 ~-2 ~-1 red_concrete if block ~1 ~-2 ~2 black_concrete if block ~-1 ~-2 ~2 black_concrete if block ~1 ~-2 ~-2 black_concrete if block ~-1 ~-2 ~-2 black_concrete if block ~2 ~-2 ~1 black_concrete if block ~-2 ~-2 ~1 black_concrete if block ~2 ~-2 ~-1 black_concrete if block ~-2 ~-2 ~-1 black_concrete run return 1
170
+
171
+ # Else, fail
172
+ return fail
173
+ """) # noqa: E501
174
+
@@ -3,7 +3,7 @@
3
3
  from beet.core.utils import JsonDict, TextComponent
4
4
 
5
5
  from ...core.__memory__ import Mem
6
- from ...core.constants import PULVERIZING
6
+ from ...core.constants import AWAKENED_FORGE, PULVERIZING
7
7
  from ...core.ingredients import FURNACES_RECIPES_TYPES, ingr_to_id
8
8
  from .book_components import get_item_component
9
9
  from .other_utils import convert_shapeless_to_shaped, high_res_font_from_craft
@@ -34,6 +34,11 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str, in_lore:
34
34
  page_font = high_res_font_from_craft(craft)
35
35
  use_dialog: bool = SharedMemory.use_dialog > 0 and not in_lore # In lore, we don't need to re-align the content
36
36
 
37
+ # Convert AWAKENED_FORGE to shaped crafting
38
+ if craft_type == AWAKENED_FORGE:
39
+ craft = convert_shapeless_to_shaped(craft)
40
+ craft["type"] = AWAKENED_FORGE
41
+
37
42
  # Show up item title and page font
38
43
  titled = name.replace("_", " ").title() + "\n"
39
44
  content.append({"text": titled, "font": "minecraft:default", "color": "black", "underlined": True})
@@ -156,6 +161,123 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str, in_lore:
156
161
  if len(shape) < 2:
157
162
  content.append("\n")
158
163
 
164
+ # If the craft is AWAKENED_FORGE type
165
+ elif craft_type == AWAKENED_FORGE:
166
+ shape: list[str] = craft["shape"]
167
+ is_small_craft: bool = len(shape) <= 3 and all(len(x) <= 3 for x in shape)
168
+ if use_dialog and not is_small_craft:
169
+ content[-1] = content[-1].replace(page_font, page_font + VERY_SMALL_NONE_FONT*2) # type: ignore
170
+
171
+ # Convert each ingredients to its text component
172
+ formatted_ingredients: dict[str, JsonDict] = {}
173
+ for k, v in craft["ingredients"].items():
174
+ formatted_ingredients[k] = get_item_component(v, count=v.get("count", 1))
175
+
176
+ # Adjust craft shape for special cases
177
+ # Special case: if it's 1 line with 3 columns, add empty lines to center it
178
+ if len(shape) == 1 and len(shape[0]) == 3:
179
+ shape = [" ", shape[0], " "]
180
+
181
+ # Special case: if it's 3 lines with 1 column each, center them horizontally
182
+ elif (len(shape) == 3 and
183
+ all(len(shape_line) == 1 for shape_line in shape)):
184
+ shape = [" " + line + " " for line in shape]
185
+
186
+ # Add each ingredient to the craft
187
+ for index, line in enumerate(shape):
188
+ for i in range(2): # We need two lines to make a square, otherwise it will be a rectangle
189
+ content.append(SMALL_NONE_FONT)
190
+ for k in line:
191
+ if k == " ":
192
+ content.append(INVISIBLE_ITEM_WIDTH)
193
+ else:
194
+ if i == 0:
195
+ content.append(formatted_ingredients[k])
196
+ else:
197
+ copy = formatted_ingredients[k].copy()
198
+ copy["text"] = INVISIBLE_ITEM_WIDTH
199
+ content.append(copy)
200
+ if use_dialog and index != 1 and (not is_small_craft or i != 1):
201
+ content.append(INVISIBLE_ITEM_WIDTH * max(0, (3 if is_small_craft else 4) - len(line)))
202
+ if is_small_craft:
203
+ content.append(NONE_FONT * 2)
204
+ else:
205
+ content.append(NONE_FONT + SMALL_NONE_FONT)
206
+ content.append("\n")
207
+ if len(shape) == 1 and len(shape[0]) < 3:
208
+ content.append("\n")
209
+ pass
210
+
211
+ # Add the result to the craft
212
+ if is_small_craft:
213
+ # First layer of the square
214
+ len_line = len(shape[1]) if len(shape) > 1 else 0
215
+ offset = 4 - len_line
216
+ break_line_pos = content.index("\n", content.index("\n") + 1) # Find the second line break
217
+ try:
218
+ break_line_pos = content.index("\n", break_line_pos + 1) # Find the third line break
219
+ except Exception:
220
+ content.append(SMALL_NONE_FONT)
221
+ break_line_pos = len(content)
222
+ content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1) + SMALL_NONE_FONT * 2))
223
+ content.insert(break_line_pos + 1, result_component)
224
+ if use_dialog:
225
+ content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
226
+ break_line_pos += 1
227
+
228
+ # Second layer of the square
229
+ try:
230
+ break_line_pos = content.index("\n", break_line_pos + 3) # Find the fourth line break
231
+ except Exception:
232
+ content.append("\n" + SMALL_NONE_FONT)
233
+ break_line_pos = len(content)
234
+ content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1) + SMALL_NONE_FONT * 2))
235
+ copy = result_component.copy()
236
+ copy["text"] = INVISIBLE_ITEM_WIDTH
237
+ content.insert(break_line_pos + 1, copy)
238
+ if use_dialog:
239
+ content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
240
+
241
+ # Add break lines for the third layer of a 3x3 craft
242
+ if len(shape) < 3 and len(shape[0]) == 3:
243
+ content.append("\n\n")
244
+ if len(shape) < 2:
245
+ content.append("\n")
246
+ else:
247
+ # First layer of the square
248
+ len_line = len(shape[1]) if len(shape) > 1 else 0
249
+ offset = 4 - len_line
250
+ break_line_pos = content.index("\n", content.index("\n") + 1) # Find the second line break
251
+ try:
252
+ break_line_pos = content.index("\n", break_line_pos + 1) # Find the third line break
253
+ except Exception:
254
+ content.append(SMALL_NONE_FONT)
255
+ break_line_pos = len(content)
256
+ content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1)) + MICRO_NONE_FONT)
257
+ content.insert(break_line_pos + 1, result_component)
258
+ if use_dialog:
259
+ content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
260
+ break_line_pos += 1
261
+
262
+ # Second layer of the square
263
+ try:
264
+ break_line_pos = content.index("\n", break_line_pos + 3) # Find the fourth line break
265
+ except Exception:
266
+ content.append("\n" + SMALL_NONE_FONT)
267
+ break_line_pos = len(content)
268
+ content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1)) + MICRO_NONE_FONT)
269
+ copy = result_component.copy()
270
+ copy["text"] = INVISIBLE_ITEM_WIDTH
271
+ content.insert(break_line_pos + 1, copy)
272
+ if use_dialog:
273
+ content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
274
+
275
+ # Add break lines for the third layer of a 3x4 craft
276
+ if len(shape) < 3 and len(shape[0]) == 4:
277
+ content.append("\n\n")
278
+ if len(shape) < 2:
279
+ content.append("\n")
280
+ content.insert(3, "\n")
159
281
 
160
282
  # If the type is furnace type,
161
283
  elif craft_type in FURNACES_RECIPES_TYPES: