stewbeet 2.2.8__tar.gz → 2.2.9__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 (241) hide show
  1. {stewbeet-2.2.8 → stewbeet-2.2.9}/PKG-INFO +1 -1
  2. {stewbeet-2.2.8 → stewbeet-2.2.9}/pyproject.toml +1 -1
  3. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/constants.py +1 -0
  4. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/completion.py +12 -0
  5. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/ingredients.py +49 -29
  6. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/custom_blocks/__init__.py +7 -5
  7. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +5 -3
  8. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/book_components.py +2 -2
  9. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/image_utils.py +4 -2
  10. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/iso_renders.py +11 -14
  11. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/main.py +9 -9
  12. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/other_utils.py +26 -26
  13. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/shared_import.py +1 -1
  14. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/verify_definitions/__init__.py +0 -4
  15. {stewbeet-2.2.8 → stewbeet-2.2.9}/.gitignore +0 -0
  16. {stewbeet-2.2.8 → stewbeet-2.2.9}/LICENSE +0 -0
  17. {stewbeet-2.2.8 → stewbeet-2.2.9}/README.md +0 -0
  18. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/__init__.py +0 -0
  19. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/__main__.py +0 -0
  20. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/all.py +0 -0
  21. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/cli.py +0 -0
  22. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/__init__.py +0 -0
  23. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  24. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/github.py +0 -0
  25. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/modrinth.py +0 -0
  26. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/pmc.py +0 -0
  27. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/continuous_delivery/smithed.py +0 -0
  28. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  29. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  30. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  31. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/cables.py +0 -0
  32. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  33. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  34. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  35. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  36. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  37. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  38. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  39. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  40. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  41. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  42. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  43. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  44. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  45. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  46. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  47. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  48. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  49. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  50. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  51. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  52. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  53. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  54. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  55. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  56. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  57. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  58. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  59. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  60. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  61. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  62. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  63. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  64. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  65. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  66. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  67. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  68. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  69. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  70. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  71. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  72. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  73. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  74. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  75. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  76. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  77. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  78. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  79. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  80. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  81. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  82. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  83. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  84. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  85. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  86. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  87. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  88. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  89. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  90. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  91. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  92. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  93. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  94. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  95. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  96. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  97. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/gui.py +0 -0
  98. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  99. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  100. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/py.typed +0 -0
  101. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
  102. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
  103. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
  104. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
  105. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
  106. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
  107. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
  108. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
  109. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  110. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/__init__.py +0 -0
  111. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/__memory__.py +0 -0
  112. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/__init__.py +0 -0
  113. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/equipments.py +0 -0
  114. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/materials.py +0 -0
  115. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/records.py +0 -0
  116. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
  117. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  118. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/definitions_helper/text.py +0 -0
  119. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/utils/io.py +0 -0
  120. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/core/utils/sounds.py +0 -0
  121. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/__init__.py +0 -0
  122. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/bookshelf.py +0 -0
  123. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/bookshelf_config.json +0 -0
  124. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  125. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  126. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  127. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  128. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  129. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  130. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  131. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  132. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  133. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  134. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  135. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  136. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  137. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  138. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  139. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  140. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  141. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  142. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  143. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  144. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  145. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  146. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  147. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  148. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  149. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  150. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  151. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  152. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  153. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  154. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  155. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  156. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  157. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/archive/__init__.py +0 -0
  158. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  159. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
  160. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
  161. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
  162. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/headers/object.py +0 -0
  163. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  164. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  165. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  166. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  167. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  168. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  169. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_paintings/__init__.py +0 -0
  170. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  171. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  172. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  173. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  174. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  175. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  176. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  177. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
  178. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
  179. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
  180. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/match.py +0 -0
  181. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
  182. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
  183. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
  184. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  185. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  186. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  187. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  188. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  189. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  190. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  191. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  192. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  193. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  194. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
  195. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  196. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  197. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  198. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  199. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  200. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  201. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
  202. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  203. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  204. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  205. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
  206. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  207. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  208. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
  209. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
  210. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
  211. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  212. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  213. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  214. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  215. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  216. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  217. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  218. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
  219. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  220. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  221. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  222. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  223. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  224. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  225. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
  226. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  227. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  228. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  229. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
  230. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  231. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  232. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/initialize/__init__.py +0 -0
  233. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  234. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  235. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  236. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  237. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  238. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  239. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  240. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/py.typed +0 -0
  241. {stewbeet-2.2.8 → stewbeet-2.2.9}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.2.8
3
+ Version: 2.2.9
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.2.8"
8
+ version = "2.2.9"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -87,6 +87,7 @@ NOT_COMPONENTS: list[str] = [ # Keys that should not be considered as comp
87
87
  FACES: tuple[str, ...] = ("down", "up", "north", "south", "west", "east") # Faces of a block, used for resource pack and blocks orientation
88
88
  SIDES: tuple[str, ...] = ("_bottom", "_top", "_front", "_back", "_left", "_right", "_side") # Sides of a block, used for resource pack
89
89
  DOWNLOAD_VANILLA_ASSETS_RAW = "https://raw.githubusercontent.com/edayot/renders/renders/resourcepack/assets/minecraft/textures/render"
90
+ DOWNLOAD_VANILLA_ASSETS_SPECIAL_RAW = "https://raw.githubusercontent.com/edayot/renders/renders-special/resourcepack/assets/minecraft/textures/render"
90
91
  DOWNLOAD_VANILLA_ASSETS_SOURCE = "https://github.com/edayot/renders/tree/renders/resourcepack/assets/minecraft/textures/render"
91
92
  CUSTOM_BLOCK_HEAD_CUBE_RADIUS: tuple[int, int, int] = (16, 16, 16) # Size of the region to check around the player when placing a CUSTOM_BLOCK_HEAD
92
93
  BLOCKS_WITH_INTERFACES: list[str] = [ # List of blocks that are containers and have an interface
@@ -107,3 +107,15 @@ def add_smithed_ignore_vanilla_behaviours_convention() -> None:
107
107
  data["custom_data"].smithed.ignore.functionality = True # pyright: ignore[reportUnknownMemberType]
108
108
  data["custom_data"].smithed.ignore.crafting = True # pyright: ignore[reportUnknownMemberType]
109
109
 
110
+ # Set manual components
111
+ def set_manual_components(white_list: list[str]) -> None:
112
+ """ Override the components to include in the manual when hovering items.
113
+
114
+ Args:
115
+ white_list (list[str]): The list of components to include.
116
+ """
117
+ if not white_list:
118
+ return
119
+ from ...plugins.ingame_manual.shared_import import SharedMemory
120
+ SharedMemory.components_to_include = white_list
121
+
@@ -80,27 +80,30 @@ def ingr_to_id(ingredient: JsonDict, add_namespace: bool = True) -> str:
80
80
  """
81
81
  if isinstance(ingredient, str):
82
82
  ingredient = {"item": ingredient}
83
- if ingredient.get("item"):
84
- if not add_namespace:
85
- return ingredient["item"].split(":")[1]
86
- return ingredient["item"]
87
- else:
88
- custom_data: JsonDict = ingredient["components"]["minecraft:custom_data"]
89
- namespace: str = ""
90
- id: str = ""
91
- for cd_ns, cd_data in custom_data.items():
92
- if isinstance(cd_data, dict):
93
- cd_data = cast(JsonDict, cd_data)
94
- values: list[Any] = list(cd_data.values())
95
- if isinstance(values[0], bool):
96
- namespace = cd_ns
97
- id = next(iter(cd_data.keys()))
98
- break
99
- if not namespace:
100
- error(f"No namespace found in custom data: {custom_data}, ingredient: {ingredient}")
101
- if add_namespace:
102
- return namespace + ":" + id
103
- return id
83
+ for k in ("item", "id"):
84
+ if ingredient.get(k):
85
+ if not add_namespace and ":" in ingredient[k]:
86
+ return ingredient[k].split(":")[1]
87
+ elif add_namespace and ":" not in ingredient[k]:
88
+ return "minecraft:" + ingredient[k]
89
+ return ingredient[k]
90
+
91
+ custom_data: JsonDict = ingredient["components"]["minecraft:custom_data"]
92
+ namespace: str = ""
93
+ id: str = ""
94
+ for cd_ns, cd_data in custom_data.items():
95
+ if isinstance(cd_data, dict):
96
+ cd_data = cast(JsonDict, cd_data)
97
+ values: list[Any] = list(cd_data.values())
98
+ if isinstance(values[0], bool):
99
+ namespace = cd_ns
100
+ id = next(iter(cd_data.keys()))
101
+ break
102
+ if not namespace:
103
+ error(f"No namespace found in custom data: {custom_data}, ingredient: {ingredient}")
104
+ if add_namespace:
105
+ return namespace + ":" + id
106
+ return id
104
107
 
105
108
  # Mainly used for recipes
106
109
  @simple_cache
@@ -185,34 +188,51 @@ def get_item_from_ingredient(ingredient: JsonDict) -> JsonDict:
185
188
 
186
189
  # Make a loot table
187
190
  @simple_cache
188
- def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int) -> str:
191
+ def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int | dict) -> str:
192
+ """ Get the loot table for an ingredient dict
193
+ Args:
194
+ result_ingredient (dict): The ingredient dict
195
+ ex: {"item": "minecraft:stick"}
196
+ result_count (int|dict): The count of the result item, can be an int or a dict for random counts
197
+ ex: 1
198
+ ex: {"type": "minecraft:uniform","min": 4,"max": 6}
199
+ Returns:
200
+ str: The loot table path, ex: "my_datapack:i/stick"
201
+ """
189
202
 
190
203
  # If item from this datapack
191
204
  item: str = ingr_to_id(result_ingredient)
192
205
  if item.startswith(Mem.ctx.project_id):
193
206
  item = item.split(":")[1]
194
207
  loot_table = f"{Mem.ctx.project_id}:i/{item}"
195
- if result_count > 1:
208
+ if isinstance(result_count, int) and result_count > 1:
196
209
  loot_table += f"_x{result_count}"
210
+ elif isinstance(result_count, dict):
211
+ minimum = result_count.get("min", 1)
212
+ maximum = result_count.get("max", 1)
213
+ if maximum > 1:
214
+ loot_table += f"_x{minimum}to{maximum}"
197
215
  return loot_table
198
216
 
199
217
  namespace, item = item.split(":")
200
218
  loot_table = f"{Mem.ctx.project_id}:recipes/{namespace}/{item}"
201
- if result_count > 1:
219
+ if isinstance(result_count, int) and result_count > 1:
202
220
  loot_table += f"_x{result_count}"
221
+ elif isinstance(result_count, dict):
222
+ minimum = result_count.get("min", 1)
223
+ maximum = result_count.get("max", 1)
224
+ if maximum > 1:
225
+ loot_table += f"_x{minimum}to{maximum}"
203
226
 
204
227
  # If item from another datapack, generate the loot table
205
- path: str = f"{Mem.ctx.project_id}:recipes/{namespace}/{item}"
206
- if result_count > 1:
207
- path += f"_x{result_count}"
208
228
  if namespace != "minecraft":
209
229
  file: JsonDict = {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value": f"{Mem.ctx.project_id}:external/{namespace}/{item}"}] }] }
210
230
  else:
211
231
  file: JsonDict = {"pools":[{"rolls":1,"entries":[{"type":"minecraft:item","name":f"{namespace}:{item}"}] }] }
212
- if result_count > 1:
232
+ if (isinstance(result_count, int) and result_count > 1) or isinstance(result_count, dict):
213
233
  file["pools"][0]["entries"][0]["functions"] = [{"function": "minecraft:set_count","count": result_count}]
214
234
 
215
- Mem.ctx.data[f"{Mem.ctx.project_id}:recipes/{namespace}/{item}"] = LootTable(super_json_dump(file, max_level=9))
235
+ Mem.ctx.data[loot_table] = LootTable(super_json_dump(file, max_level=9))
216
236
  return loot_table
217
237
 
218
238
  @simple_cache
@@ -137,14 +137,16 @@ execute if score #rotation {ns}.data matches 0 if predicate {ns}:facing/west run
137
137
  # Advancement revoke
138
138
  advancement revoke @s only {ns}:custom_block_alternative/{item}
139
139
 
140
- # Execute the place function as and at the new placed item frame
141
- tag @s add {ns}.to_refund
140
+ # Execute the place function as and at the new placed item frame""")
141
+ if "id" not in block:
142
+ write_function(f"{ns}:custom_blocks/{item}/search", f"execute as @e[type=item_frame,tag={ns}.new,tag={ns}.{item}] at @s run function {ns}:custom_blocks/{item}/place_main")
143
+ # Make place check function (only if "id" is in VANILLA_BLOCK)
144
+ else:
145
+ write_function(f"{ns}:custom_blocks/{item}/search", f"""tag @s add {ns}.to_refund
142
146
  execute as @e[type=item_frame,tag={ns}.new,tag={ns}.{item}] at @s run function {ns}:custom_blocks/{item}/place_check
143
147
  tag @s remove {ns}.to_refund
144
148
  """)
145
-
146
- # Make place check function
147
- write_function(f"{ns}:custom_blocks/{item}/place_check", f"""
149
+ write_function(f"{ns}:custom_blocks/{item}/place_check", f"""
148
150
  # Check if there is air block at the position
149
151
  execute if block ~ ~ ~ air run return run function {ns}:custom_blocks/{item}/place_main
150
152
 
@@ -30,14 +30,16 @@ def beet_default(ctx: Context) -> None:
30
30
  # Ex: {'some_folder/dirt.png', 'stone.png', ...}
31
31
  textures: set[str] = {relative_path(str(p), textures_folder) for p in Path(textures_folder).rglob("*.png")}
32
32
 
33
- # 2) For each texture, check if any of the ctx.assets.textures endswith the texture path.
33
+ # 2) For each texture, check if any of the ctx.assets.textures matches the texture filename.
34
34
  unused_paths: set[str] = set()
35
35
  for path in textures:
36
+ # Get just the filename without extension for comparison
37
+ filename_no_ext: str = os.path.splitext(os.path.basename(path))[0]
36
38
  no_extension_path: str = os.path.splitext(path)[0]
37
39
  if not any(
38
- str(texture.source_path).endswith(no_extension_path) if isinstance(texture, Texture)
40
+ (str(texture.source_path).endswith(no_extension_path) or filename_no_ext in str(texture.source_path)) if isinstance(texture, Texture)
39
41
  else (
40
- texture.endswith(no_extension_path) if isinstance(texture, str)
42
+ (texture.endswith(no_extension_path) or filename_no_ext in texture) if isinstance(texture, str)
41
43
  else False
42
44
  )
43
45
  for texture in cast(list[Any], ctx.assets.textures)
@@ -10,7 +10,7 @@ from stouputils.print import error, warning
10
10
  from ...core.__memory__ import Mem
11
11
  from ...core.ingredients import ingr_to_id
12
12
  from .image_utils import generate_high_res_font
13
- from .shared_import import COMPONENTS_TO_INCLUDE, NONE_FONT, SharedMemory, get_page_number
13
+ from .shared_import import NONE_FONT, SharedMemory, get_page_number
14
14
 
15
15
 
16
16
  # Call the previous function
@@ -107,7 +107,7 @@ def get_item_component(ingredient: str | JsonDict, only_those_components: list[s
107
107
  components[key] = item[key]
108
108
  else:
109
109
  for key, value in item.items():
110
- if key in COMPONENTS_TO_INCLUDE:
110
+ if key in SharedMemory.components_to_include:
111
111
  components[key] = value
112
112
  formatted["hover_event"]["components"] = components
113
113
 
@@ -6,7 +6,7 @@ from typing import Any, cast
6
6
 
7
7
  from PIL import Image, ImageDraw, ImageFont
8
8
 
9
- from ...core.__memory__ import Mem
9
+ from ...core.__memory__ import JsonDict, Mem
10
10
  from .shared_import import (
11
11
  MICRO_NONE_FONT,
12
12
  TEMPLATES_PATH,
@@ -101,7 +101,7 @@ def image_count(count: int | str) -> Image.Image:
101
101
  return img
102
102
 
103
103
  # Generate high res image for item
104
- def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -> str:
104
+ def generate_high_res_font(item: str, item_image: Image.Image, count: int | str | JsonDict = 1) -> str:
105
105
  """ Generate the high res font to display in the manual for the item
106
106
  Args:
107
107
  item (str): The name of the item, ex: "adamantium_fragment"
@@ -111,6 +111,8 @@ def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -
111
111
  str: The font to the generated texture
112
112
  """
113
113
  font = get_next_font()
114
+ if isinstance(count, dict):
115
+ count = f"{count.get('min', 1)}-{count.get('max', 1)}"
114
116
  item = f"{item}_{str(count).replace('-', '_')}" if isinstance(count, str) or count > 1 else item
115
117
 
116
118
  # Get output path
@@ -16,6 +16,7 @@ from ...core.__memory__ import Mem
16
16
  from ...core.constants import (
17
17
  DOWNLOAD_VANILLA_ASSETS_RAW,
18
18
  DOWNLOAD_VANILLA_ASSETS_SOURCE,
19
+ DOWNLOAD_VANILLA_ASSETS_SPECIAL_RAW,
19
20
  RESULT_OF_CRAFTING,
20
21
  USED_FOR_CRAFTING,
21
22
  )
@@ -97,20 +98,16 @@ def generate_all_iso_renders():
97
98
  if not destination:
98
99
  destination = f"{path}/minecraft/{item}.png"
99
100
  if not (os.path.exists(destination) and cache_assets): # If not downloaded yet or not using cache
100
- link: str = f"{DOWNLOAD_VANILLA_ASSETS_RAW}/item/{item}.png"
101
- response = requests.get(link)
102
- if response.status_code == 200:
103
- with super_open(destination, "wb") as file:
104
- file.write(response.content)
105
- else:
106
- link = link.replace("item/", "block/")
107
- response = requests.get(link)
108
- if response.status_code == 200:
109
- with super_open(destination, "wb") as file:
110
- file.write(response.content)
111
- else:
112
- warning(f"Failed to download texture '{link}', please add it manually to '{destination}'")
113
- warning(f"Suggestion link: '{DOWNLOAD_VANILLA_ASSETS_SOURCE}'")
101
+ for base_link in (DOWNLOAD_VANILLA_ASSETS_SPECIAL_RAW, DOWNLOAD_VANILLA_ASSETS_RAW):
102
+ for folder in ["item", "block", "items"]:
103
+ link: str = f"{base_link}/{folder}/{item}.png"
104
+ response = requests.get(link)
105
+ if response.status_code == 200:
106
+ with super_open(destination, "wb") as file:
107
+ return file.write(response.content)
108
+ # If all attempts failed
109
+ warning(f"Failed to download texture for '{item}', please add it manually to '{destination}'")
110
+ warning(f"Suggestion link: '{DOWNLOAD_VANILLA_ASSETS_SOURCE}'")
114
111
 
115
112
  # Multithread the download
116
113
  multithreading(download_item, used_vanilla_items, max_workers=min(32, len(used_vanilla_items)))
@@ -288,7 +288,7 @@ def routine():
288
288
  x += simple_case.size[0]
289
289
 
290
290
  # Add the click_event part to the line and add the 2 times the line if enough items
291
- component = get_item_component(item, only_those_components=["item_name", "custom_name"])
291
+ component = get_item_component(item, only_those_components=["item_name", "custom_name", "attribute_modifiers"])
292
292
  component["text"] = MEDIUM_NONE_FONT if not SharedMemory.high_resolution else high_res_font
293
293
  line.append(component)
294
294
  if len(line) == MAX_ITEMS_PER_ROW:
@@ -441,6 +441,12 @@ def routine():
441
441
  if craft["type"] == "crafting_shapeless":
442
442
  craft = convert_shapeless_to_shaped(craft)
443
443
 
444
+ # Skip if result is same as previous result
445
+ current_result: Any | None = craft.get("result")
446
+ if current_result and current_result == previous_result and craft["type"] != "mining":
447
+ continue
448
+ previous_result = current_result
449
+
444
450
  # Get breaklines
445
451
  breaklines = 3
446
452
  if "shape" in craft:
@@ -476,7 +482,7 @@ def routine():
476
482
  PULVERIZING: "SimplEnergy Pulverizing"
477
483
  }
478
484
  recipe_title = recipe_type_names.get(craft["type"], craft["type"].replace("_", " ").title())
479
- hover_text.insert(0, {"text": f"{recipe_title}\n", "color": "yellow"})
485
+ hover_text.append({"text": f"\n{recipe_title}", "color": "yellow"})
480
486
 
481
487
  # Append ingredients
482
488
  if craft["type"] == "mining":
@@ -532,12 +538,6 @@ def routine():
532
538
  hover_text.append({"text": "\n- Pattern: ", "color": "gray"})
533
539
  hover_text.append({"text": pattern_name, "color": "gray"})
534
540
 
535
- # Skip if result is same as previous result
536
- current_result: Any | None = craft.get("result")
537
- if current_result and current_result == previous_result and craft["type"] != "mining":
538
- continue
539
- previous_result = current_result
540
-
541
541
  # Add the craft to the content
542
542
  result_or_ingredient = WIKI_RESULT_OF_CRAFT_FONT if "result" not in craft else generate_wiki_font_for_ingr(name, craft)
543
543
  info_buttons.append({
@@ -595,7 +595,7 @@ def routine():
595
595
 
596
596
  # If there are more than buttons_limit buttons, remove lowest priority ones until there is buttons_limit left
597
597
  while len(info_buttons) > buttons_limit:
598
- lowest_priority: int = min(info_buttons[::-1], key=lambda x: x.get("priority", 1))
598
+ lowest_priority: JsonDict = min(info_buttons[::-1], key=lambda x: x.get("priority", 1))
599
599
  info_buttons.remove(lowest_priority)
600
600
 
601
601
  # Keep only the last buttons_limit buttons (maximum that can be displayed with 5 per line and 4 lines)
@@ -1,8 +1,6 @@
1
1
 
2
2
  # ruff: noqa: E501
3
3
  # Imports
4
- from typing import cast
5
-
6
4
  from beet.core.utils import JsonDict
7
5
  from stouputils.decorators import simple_cache
8
6
 
@@ -32,22 +30,24 @@ def convert_shapeless_to_shaped(craft: JsonDict) -> JsonDict:
32
30
  if craft.get("result"):
33
31
  shaped_recipe["result"] = craft["result"]
34
32
 
35
- # Get all ingredients to the dictionary
33
+ # Get all ingredients to the dictionary and map each ingredient to a key, preserving order
36
34
  next_key: str = "A"
37
- for ingr in shapeless_ingredients:
38
- key: str = next_key
35
+ ingredient_to_key: dict[str, str] = {}
36
+ ordered_keys: list[str] = []
39
37
 
40
- # Check if the ingredient is already in the shaped recipe, if so stop early
41
- for new_key, new_ingr in shaped_recipe["ingredients"].items():
42
- if str(ingr) == str(new_ingr):
43
- key = new_key # This will skip the next condition below
44
- break
38
+ for ingr in shapeless_ingredients:
39
+ ingr_str = str(ingr)
45
40
 
46
- # If the key is still the next key, it means it's a new ingredient, add it to the dictionary and update the next key
47
- if key == next_key:
41
+ # Check if we've already seen this ingredient
42
+ if ingr_str not in ingredient_to_key:
43
+ # New ingredient, assign it the next key
44
+ ingredient_to_key[ingr_str] = next_key
48
45
  shaped_recipe["ingredients"][next_key] = ingr
49
46
  next_key = chr(ord(next_key) + 1)
50
47
 
48
+ # Record the key for this position (preserving order)
49
+ ordered_keys.append(ingredient_to_key[ingr_str])
50
+
51
51
  # Make the shape of the craft, with an exception when 2 materials to put one alone in the center
52
52
  if len(shaped_recipe["ingredients"]) == 2 and total_items in (5, 9):
53
53
 
@@ -61,21 +61,21 @@ def convert_shapeless_to_shaped(craft: JsonDict) -> JsonDict:
61
61
  elif total_items == 5:
62
62
  shaped_recipe["shape"] = [f" {big} ", big+other+big, f" {big} "]
63
63
  else:
64
-
65
- # For each ingredient, add to the shape depending on the occurences
66
- shaped_recipe["shape"] = cast(list[str], [])
67
- for key, ingr in shaped_recipe["ingredients"].items():
68
- for ingr_craft in craft["ingredients"]:
69
- if str(ingr_craft) == str(ingr):
70
- shaped_recipe["shape"].append(key)
71
-
72
- # Fix the shape (ex: ["A","A","A","B","B","B","C","C","C"] -> ["AAA","BBB","CCC"])
73
- # ex 2: ["A","B","C","D"] -> ["AB","CD"]
74
- col_size = 3
75
- if len(shaped_recipe["shape"]) <= 4:
64
+ # Determine the grid size based on total items
65
+ # Perfect squares: 1, 4, 9 -> use sqrt as col_size
66
+ # Otherwise: use 3 for <=9 items, 2 for <=4 items
67
+ import math
68
+ sqrt_items = int(math.sqrt(total_items))
69
+ if sqrt_items * sqrt_items == total_items:
70
+ # Perfect square
71
+ col_size = sqrt_items
72
+ elif total_items <= 4:
76
73
  col_size = 2
77
- ranged = range(0, len(shaped_recipe["shape"]), col_size)
78
- shaped_recipe["shape"] = ["".join(shaped_recipe["shape"][i:i + col_size]) for i in ranged]
74
+ else:
75
+ col_size = 3
76
+
77
+ # Build the shape preserving the original order
78
+ shaped_recipe["shape"] = ["".join(ordered_keys[i:i + col_size]) for i in range(0, len(ordered_keys), col_size)]
79
79
 
80
80
  # Return the shaped craft
81
81
  return shaped_recipe
@@ -23,7 +23,6 @@ def get_next_font() -> str: # Returns an incrementing value for each craft
23
23
 
24
24
 
25
25
  # Constants
26
- COMPONENTS_TO_INCLUDE: list[str] = ["item_name", "lore", "custom_name", "damage", "max_damage"]
27
26
  SQUARE_SIZE: int = 32
28
27
  MANUAL_ASSETS_PATH: str = clean_path(os.path.dirname(os.path.realpath(__file__)) + "/")
29
28
  TEMPLATES_PATH: str = MANUAL_ASSETS_PATH + "templates"
@@ -67,6 +66,7 @@ HOVER_EQUIVALENTS: dict[str, str] = {
67
66
 
68
67
  # Global variables
69
68
  class SharedMemory:
69
+ components_to_include: list[str] = ["item_name", "lore", "custom_name", "damage", "max_damage"]
70
70
  next_craft_font: int = 0x8000
71
71
  font_providers: list[JsonDict] = []
72
72
  manual_pages: list[JsonDict] = []
@@ -247,10 +247,6 @@ def beet_default(ctx: Context) -> None:
247
247
  if not recipe.get("cookingtime") or not isinstance(recipe["cookingtime"], int):
248
248
  errors.append(f"Recipe #{i} in RESULT_OF_CRAFTING should have an int 'cookingtime' key for '{item}'")
249
249
 
250
- # Check the result count
251
- if (not recipe.get("result_count") or not isinstance(recipe["result_count"], int)) and (recipe.get("type") not in ("smithing_trim",)):
252
- errors.append(f"Recipe #{i} in RESULT_OF_CRAFTING should have an int 'result_count' key for '{item}'")
253
-
254
250
  # Check the PAINTING_DATA key
255
251
  if data.get(PAINTING_DATA):
256
252
  if data["id"] != "minecraft:painting":
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes