stewbeet 2.2.0__tar.gz → 2.2.2__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 (240) hide show
  1. {stewbeet-2.2.0 → stewbeet-2.2.2}/PKG-INFO +1 -1
  2. {stewbeet-2.2.0 → stewbeet-2.2.2}/pyproject.toml +1 -1
  3. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/cli.py +1 -1
  4. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/constants.py +2 -0
  5. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/materials.py +9 -9
  6. stewbeet-2.2.2/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
  7. stewbeet-2.2.2/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
  8. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/book_components.py +8 -7
  9. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/craft_content.py +10 -9
  10. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/image_utils.py +18 -10
  11. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/main.py +172 -49
  12. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/other_utils.py +3 -7
  13. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/page_font.py +5 -2
  14. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/shared_import.py +18 -15
  15. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/_README.md +1 -1
  16. stewbeet-2.2.2/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
  17. stewbeet-2.2.2/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
  18. {stewbeet-2.2.0 → stewbeet-2.2.2}/.gitignore +0 -0
  19. {stewbeet-2.2.0 → stewbeet-2.2.2}/LICENSE +0 -0
  20. {stewbeet-2.2.0 → stewbeet-2.2.2}/README.md +0 -0
  21. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/__init__.py +0 -0
  22. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/__main__.py +0 -0
  23. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/all.py +0 -0
  24. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/__init__.py +0 -0
  25. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  26. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/github.py +0 -0
  27. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/modrinth.py +0 -0
  28. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/pmc.py +0 -0
  29. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/smithed.py +0 -0
  30. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  31. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  32. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  33. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/cables.py +0 -0
  34. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  35. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  36. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  37. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  38. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  39. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  40. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  41. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  42. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  43. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  44. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  45. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  46. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  47. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  48. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  49. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  50. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  51. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  52. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  53. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  54. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  55. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  56. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  57. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  58. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  59. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  60. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  61. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  62. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  63. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  64. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  65. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  66. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  67. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  68. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  69. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  70. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  71. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  72. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  73. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  74. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  75. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  76. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  77. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  78. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  79. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  80. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  81. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  82. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  83. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  84. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  85. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  86. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  87. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  88. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  89. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  90. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  91. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  92. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  93. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  94. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  95. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  96. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  97. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  98. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  99. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/gui.py +0 -0
  100. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  101. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  102. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/py.typed +0 -0
  103. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
  104. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
  105. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
  106. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
  107. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
  108. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
  109. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
  110. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
  111. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  112. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/__init__.py +0 -0
  113. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/__memory__.py +0 -0
  114. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/__init__.py +0 -0
  115. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/completion.py +0 -0
  116. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/equipments.py +0 -0
  117. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/records.py +0 -0
  118. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
  119. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  120. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/text.py +0 -0
  121. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/ingredients.py +0 -0
  122. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/utils/io.py +0 -0
  123. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/utils/sounds.py +0 -0
  124. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/__init__.py +0 -0
  125. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/bookshelf.py +0 -0
  126. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/bookshelf_config.json +0 -0
  127. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  128. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  129. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  130. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  131. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  132. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  133. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  134. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  135. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  136. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  137. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  138. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  139. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  140. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  141. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  142. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  143. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  144. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  145. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  146. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  147. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  148. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  149. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  150. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  151. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  152. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  153. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  154. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  155. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  156. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  157. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  158. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  159. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  160. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/archive/__init__.py +0 -0
  161. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  162. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
  163. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
  164. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
  165. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/object.py +0 -0
  166. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  167. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  168. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  169. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  170. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  171. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  172. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  173. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  174. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  175. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  176. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  177. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  178. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  179. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  180. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
  181. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
  182. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
  183. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/match.py +0 -0
  184. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
  185. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
  186. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
  187. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  188. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  189. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  190. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  191. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  192. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  193. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  194. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  195. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  196. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  197. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  198. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  199. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  200. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  201. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  202. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  203. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  204. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
  205. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  206. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  207. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  208. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  209. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  210. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
  211. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
  212. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  213. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  214. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  215. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  216. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  217. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  218. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  219. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  220. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  221. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  222. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  223. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  224. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
  225. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  226. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  227. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  228. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  229. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  230. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/initialize/__init__.py +0 -0
  231. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  232. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  233. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  234. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  235. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  236. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  237. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  238. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
  239. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/py.typed +0 -0
  240. {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.2.0
3
+ Version: 2.2.2
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.0"
8
+ version = "2.2.2"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -15,7 +15,7 @@ from .utils import get_project_config
15
15
 
16
16
  @handle_error(message="Error while running 'stewbeet'")
17
17
  def main():
18
- second_arg: str = sys.argv[1] if len(sys.argv) == 2 else ""
18
+ second_arg: str = sys.argv[1] if len(sys.argv) == 2 else "build"
19
19
 
20
20
  # Try to find and load the beet configuration file
21
21
  cfg: ProjectConfig = get_project_config()
@@ -2,6 +2,7 @@
2
2
  # ruff: noqa: E501, RUF012
3
3
  # Imports
4
4
  from beet.core.utils import JsonDict
5
+ from beet.library import base
5
6
 
6
7
  from ..dependencies.bookshelf import BOOKSHELF_MODULES
7
8
 
@@ -49,6 +50,7 @@ MORE_DATA_VERSIONS: dict[tuple[int, ...], int] = {
49
50
  (1, 21, 10): 4556,
50
51
  }
51
52
  LATEST_MC_VERSION: str = ".".join(str(x) for x in list(MORE_DATA_VERSIONS.keys())[-1])
53
+ base.LATEST_MINECRAFT_VERSION = LATEST_MC_VERSION
52
54
 
53
55
  # Databases
54
56
  CATEGORY: str = "category" # Key for the category, used for recipes and the manual, ex: CATEGORY:"material" or CATEGORY:"equipment"
@@ -133,7 +133,7 @@ def generate_everything_about_this_material(
133
133
  gear_config = {}
134
134
  if gear == "helmet":
135
135
  if not ignore_recipes:
136
- Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X"],"ingredients":{"X": main_ingredient}}]
136
+ Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
137
137
  if equipments_config:
138
138
  gear_config = VanillaEquipments.HELMET.value[equipments_config.equivalent_to]
139
139
  Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
@@ -141,7 +141,7 @@ def generate_everything_about_this_material(
141
141
  Mem.definitions[armor]["equippable"] = {"slot":"head", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
142
142
  elif gear == "chestplate":
143
143
  if not ignore_recipes:
144
- Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","XXX","XXX"],"ingredients":{"X": main_ingredient}}]
144
+ Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","XXX","XXX"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
145
145
  if equipments_config:
146
146
  gear_config = VanillaEquipments.CHESTPLATE.value[equipments_config.equivalent_to]
147
147
  Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
@@ -149,7 +149,7 @@ def generate_everything_about_this_material(
149
149
  Mem.definitions[armor]["equippable"] = {"slot":"chest", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
150
150
  elif gear == "leggings":
151
151
  if not ignore_recipes:
152
- Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X","X X"],"ingredients":{"X": main_ingredient}}]
152
+ Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
153
153
  if equipments_config:
154
154
  gear_config = VanillaEquipments.LEGGINGS.value[equipments_config.equivalent_to]
155
155
  Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
@@ -157,7 +157,7 @@ def generate_everything_about_this_material(
157
157
  Mem.definitions[armor]["equippable"] = {"slot":"legs", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
158
158
  elif gear == "boots":
159
159
  if not ignore_recipes:
160
- Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","X X"],"ingredients":{"X": main_ingredient}}]
160
+ Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
161
161
  if equipments_config:
162
162
  gear_config = VanillaEquipments.BOOTS.value[equipments_config.equivalent_to]
163
163
  Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
@@ -185,31 +185,31 @@ def generate_everything_about_this_material(
185
185
  gear_config = VanillaEquipments.SWORD.value[equipments_config.equivalent_to]
186
186
  Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
187
187
  if not ignore_recipes:
188
- Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","X","S"],"ingredients": tools_ingr}]
188
+ Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","X","S"],"ingredients": tools_ingr,"manual_priority":0}]
189
189
  elif gear == "pickaxe":
190
190
  if equipments_config:
191
191
  gear_config = VanillaEquipments.PICKAXE.value[equipments_config.equivalent_to]
192
192
  Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
193
193
  if not ignore_recipes:
194
- Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX"," S "," S "],"ingredients": tools_ingr}]
194
+ Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX"," S "," S "],"ingredients": tools_ingr,"manual_priority":0}]
195
195
  elif gear == "axe":
196
196
  if equipments_config:
197
197
  gear_config = VanillaEquipments.AXE.value[equipments_config.equivalent_to]
198
198
  Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
199
199
  if not ignore_recipes:
200
- Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX","XS"," S"],"ingredients": tools_ingr}]
200
+ Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX","XS"," S"],"ingredients": tools_ingr,"manual_priority":0}]
201
201
  elif gear == "shovel":
202
202
  if equipments_config:
203
203
  gear_config = VanillaEquipments.SHOVEL.value[equipments_config.equivalent_to]
204
204
  Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
205
205
  if not ignore_recipes:
206
- Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","S","S"],"ingredients": tools_ingr}]
206
+ Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","S","S"],"ingredients": tools_ingr,"manual_priority":0}]
207
207
  elif gear == "hoe":
208
208
  if equipments_config:
209
209
  gear_config = VanillaEquipments.HOE.value[equipments_config.equivalent_to]
210
210
  Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
211
211
  if not ignore_recipes:
212
- Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX"," S"," S"],"ingredients": tools_ingr}]
212
+ Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX"," S"," S"],"ingredients": tools_ingr,"manual_priority":0}]
213
213
  if equipments_config:
214
214
  Mem.definitions[tool]["attribute_modifiers"] = format_attributes(equipments_config.get_tools_attributes(), SLOTS[gear], gear_config)
215
215
  if gear == "sword": # Remove the mining_efficiency attribute from swords
@@ -51,7 +51,7 @@ def high_res_font_from_ingredient(ingredient: str | JsonDict, count: int = 1) ->
51
51
 
52
52
 
53
53
  # Convert ingredient to formatted JSON for book
54
- def get_item_component(ingredient: str | JsonDict, only_those_components: list[str] | None = None, count: int = 1) -> JsonDict:
54
+ def get_item_component(ingredient: str | JsonDict, only_those_components: list[str] | None = None, count: int = 1, add_change_page: bool = True) -> JsonDict:
55
55
  """ Generate item hover text for a craft ingredient
56
56
  Args:
57
57
  ingredient (dict|str): The ingredient
@@ -112,12 +112,13 @@ def get_item_component(ingredient: str | JsonDict, only_those_components: list[s
112
112
  formatted["hover_event"]["components"] = components
113
113
 
114
114
  # If item is from my datapack, get its page number
115
- page_number = get_page_number(id)
116
- if page_number != -1:
117
- formatted["click_event"] = {
118
- "action": "change_page",
119
- "page": page_number
120
- }
115
+ if add_change_page:
116
+ page_number = get_page_number(id)
117
+ if page_number != -1:
118
+ formatted["click_event"] = {
119
+ "action": "change_page",
120
+ "page": page_number
121
+ }
121
122
 
122
123
  # High resolution
123
124
  if SharedMemory.high_resolution:
@@ -4,7 +4,7 @@ from beet.core.utils import JsonDict, TextComponent
4
4
 
5
5
  from ...core.__memory__ import Mem
6
6
  from ...core.constants import PULVERIZING
7
- from ...core.ingredients import FURNACES_RECIPES_TYPES
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
10
10
  from .page_font import generate_page_font
@@ -43,12 +43,13 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
43
43
 
44
44
  # Get result component
45
45
  result_count = craft.get("result_count", 1)
46
+ add_change_page_to_ingr: bool = False
46
47
  if not craft.get("result"):
47
- result_component = get_item_component(name, count = result_count)
48
+ result_component = get_item_component(name, count=result_count, add_change_page=False) # Avoid self-linking page
49
+ add_change_page_to_ingr = True
48
50
  else:
49
- result_component = get_item_component(craft["result"], count = result_count)
50
- if result_component.get("click_event"):
51
- del result_component["click_event"] # Remove click_event for result item (as we already are on the page)
51
+ add_change_page_to_ingr = ingr_to_id(craft["result"], add_namespace=False) == name
52
+ result_component = get_item_component(craft["result"], count=result_count, add_change_page=not add_change_page_to_ingr)
52
53
  result_component["text"] = MICRO_NONE_FONT + result_component["text"] # Left adjustment
53
54
 
54
55
  # If the craft is shaped
@@ -144,7 +145,7 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
144
145
  elif craft_type in FURNACES_RECIPES_TYPES:
145
146
 
146
147
  # Convert ingredient to its text component
147
- formatted_ingredient: JsonDict = get_item_component(craft["ingredient"])
148
+ formatted_ingredient: JsonDict = get_item_component(craft["ingredient"], add_change_page=add_change_page_to_ingr)
148
149
 
149
150
  # Add the ingredient to the craft
150
151
  for i in range(2):
@@ -265,11 +266,11 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
265
266
  content.append("\n")
266
267
  content.append("\n")
267
268
 
268
- # If the type is special Pulverizing or Stonecutting,
269
- elif craft_type in (PULVERIZING, "stonecutting"):
269
+ # If the type is special Pulverizing, Stonecutting, or Mining,
270
+ elif craft_type in (PULVERIZING, "stonecutting", "mining"):
270
271
 
271
272
  # Convert ingredient to its text component
272
- formatted_ingredient: JsonDict = get_item_component(craft["ingredient"])
273
+ formatted_ingredient: JsonDict = get_item_component(craft["ingredient"], add_change_page=add_change_page_to_ingr)
273
274
  content.append("\n\n")
274
275
  for i in range(2):
275
276
 
@@ -68,28 +68,36 @@ def add_border(image: Image.Image, border_color: tuple[int, int, int, int], bord
68
68
  return image
69
69
 
70
70
  # Generate an image showing the result count
71
- def image_count(count: int) -> Image.Image:
71
+ def image_count(count: int | str) -> Image.Image:
72
72
  """ Generate an image showing the result count
73
73
  Args:
74
- count (int): The count to show
74
+ count (int | str): The count to show
75
75
  Returns:
76
76
  Image: The image with the count
77
77
  """
78
+ count = str(count)
79
+
78
80
  # Create the image
79
81
  img = Image.new("RGBA", (32, 32), (0, 0, 0, 0))
80
82
  draw = ImageDraw.Draw(img)
81
- font_size = 16
83
+
84
+ # Reduce font size if count is too long
85
+ font_size: int = 16 if len(count) < 3 else 8
82
86
  font = ImageFont.truetype(f"{TEMPLATES_PATH}/minecraft_font.ttf", size = font_size)
83
87
 
84
88
  # Calculate text size and positions of the two texts
85
- text_width = draw.textlength(str(count), font = font)
89
+ text_width = draw.textlength(count, font = font)
86
90
  text_height = font_size + 4
87
- pos_1 = (34-text_width), (32-text_height)
88
- pos_2 = (32-text_width), (30-text_height)
91
+
92
+ # Adjust shadow offset for smaller fonts
93
+ shadow_offset: int = 0 if font_size == 16 else 1
94
+ height_offset: int = 0 if font_size == 16 else 3
95
+ pos_1 = (34-text_width-shadow_offset), (32-text_height-shadow_offset+height_offset)
96
+ pos_2 = (32-text_width), (30-text_height+height_offset)
89
97
 
90
98
  # Draw the count
91
- draw.text(pos_1, str(count), (50, 50, 50), font = font)
92
- draw.text(pos_2, str(count), (255, 255, 255), font = font)
99
+ draw.text(pos_1, count, (50, 50, 50), font = font)
100
+ draw.text(pos_2, count, (255, 255, 255), font = font)
93
101
  return img
94
102
 
95
103
  # Generate high res image for item
@@ -103,7 +111,7 @@ def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -
103
111
  str: The font to the generated texture
104
112
  """
105
113
  font = get_next_font()
106
- item = f"{item}_{count}" if count > 1 else item
114
+ item = f"{item}_{count}" if isinstance(count, str) or count > 1 else item
107
115
 
108
116
  # Get output path
109
117
  path = f"{SharedMemory.cache_path}/font/high_res/{item}.png"
@@ -121,7 +129,7 @@ def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -
121
129
  resized = resized.convert("RGBA")
122
130
 
123
131
  # Add the item count
124
- if count > 1:
132
+ if isinstance(count, str) or count > 1:
125
133
  img_count = image_count(count)
126
134
  img_count = careful_resize(img_count, high_res)
127
135
  resized.paste(img_count, (0, 0), img_count)
@@ -20,12 +20,13 @@ from ...core.constants import (
20
20
  CUSTOM_BLOCK_VANILLA,
21
21
  OFFICIAL_LIBS,
22
22
  OVERRIDE_MODEL,
23
+ PULVERIZING,
23
24
  RESULT_OF_CRAFTING,
24
25
  USED_FOR_CRAFTING,
25
26
  WIKI_COMPONENT,
26
27
  )
27
28
  from ...core.definitions_helper import add_item_name_and_lore_if_missing
28
- from ...core.ingredients import ingr_repr, ingr_to_id
29
+ from ...core.ingredients import CRAFTING_RECIPES_TYPES, ingr_repr, ingr_to_id
29
30
  from ...core.utils.io import super_merge_dict, write_load_file
30
31
  from ..initialize.source_lore_font import find_pack_png
31
32
  from ..resource_pack.item_models import (
@@ -55,6 +56,7 @@ from .shared_import import (
55
56
  HEAVY_WORKBENCH_CATEGORY,
56
57
  HOVER_EQUIVALENTS,
57
58
  HOVER_FURNACE_FONT,
59
+ HOVER_MINING_FONT,
58
60
  HOVER_PULVERIZING_FONT,
59
61
  HOVER_SHAPED_2X2_FONT,
60
62
  HOVER_SHAPED_3X3_FONT,
@@ -63,6 +65,7 @@ from .shared_import import (
63
65
  MANUAL_ASSETS_PATH,
64
66
  MEDIUM_NONE_FONT,
65
67
  MICRO_NONE_FONT,
68
+ MINING_FONT,
66
69
  NONE_FONT,
67
70
  PULVERIZING_FONT,
68
71
  SHAPED_2X2_FONT,
@@ -89,7 +92,8 @@ def deepcopy(x: Any) -> Any:
89
92
 
90
93
  def manual_main():
91
94
  # Copy everything in the manual assets folder to the templates folder
92
- os.makedirs(TEMPLATES_PATH, exist_ok = True)
95
+ with super_open(f"{TEMPLATES_PATH}/.gitignore", "w") as f:
96
+ f.write("*")
93
97
  shutil.copytree(MANUAL_ASSETS_PATH + "assets", TEMPLATES_PATH, dirs_exist_ok = True)
94
98
 
95
99
  # Copy the manual_overrides folder to the templates folder
@@ -162,6 +166,7 @@ def routine():
162
166
  Mem.ctx.assets[Mem.ctx.project_id].textures["font/furnace"] = Texture(source_path=f"{TEMPLATES_PATH}/furnace.png")
163
167
  Mem.ctx.assets[Mem.ctx.project_id].textures["font/stonecutting"] = Texture(source_path=f"{TEMPLATES_PATH}/stonecutting.png")
164
168
  Mem.ctx.assets[Mem.ctx.project_id].textures["font/pulverizing"] = Texture(source_path=f"{TEMPLATES_PATH}/pulverizing.png")
169
+ Mem.ctx.assets[Mem.ctx.project_id].textures["font/mining"] = Texture(source_path=f"{TEMPLATES_PATH}/mining.png")
165
170
 
166
171
  # If the manual cache is enabled and we have a cache file, load it
167
172
  cache_pages: bool = manual_config.get("cache_pages", False)
@@ -325,31 +330,92 @@ def routine():
325
330
  crafts = remove_unknown_crafts(crafts)
326
331
  crafts = unique_list(crafts)
327
332
 
328
- # If there are blue crafts, generate the content for the first craft
329
- blue_crafts: list[JsonDict] = [craft for craft in crafts if not craft.get("result")]
330
- if blue_crafts:
331
- # Sort crafts by result_count in reverse order
332
- blue_crafts.sort(key=lambda craft: craft.get("result_count", 0), reverse=True)
333
-
334
- # Get the first craft and generate the content
335
- first_craft: JsonDict = blue_crafts[0]
336
- content += generate_craft_content(first_craft, name, page_font)
337
-
338
- # Else, generate the content for the single item in a big box
339
- else:
340
- if page_font == "":
341
- page_font = get_page_font(number)
342
- generate_page_font(name, page_font, craft = None)
343
- component = get_item_component(name)
344
- component["text"] = NONE_FONT
345
- component["text"] *= 2
346
- content.append({"text": "", "font": FONT, "color": "white"}) # Make default font for every next component
347
- content.append({"text": titled, "font": "minecraft:default", "color": "black", "underlined": True})
348
- content.append(MEDIUM_NONE_FONT * 2 + page_font + "\n")
349
- for _ in range(4):
350
- content.append(MEDIUM_NONE_FONT * 2)
351
- content.append(component)
352
- content.append("\n")
333
+ # Helper function to add count information to mining recipes
334
+ def add_count_to_mining_recipe(mining_recipe: JsonDict, no_silk_drop_data: JsonDict | str) -> None:
335
+ if isinstance(no_silk_drop_data, dict) and "count" in no_silk_drop_data:
336
+ count_data: JsonDict | int = no_silk_drop_data["count"]
337
+ if isinstance(count_data, dict):
338
+ # Range of items like {"min": 2, "max": 8}
339
+ if "min" in count_data and "max" in count_data:
340
+ mining_recipe["result_count"] = f"{count_data['min']}-{count_data['max']}"
341
+ elif "min" in count_data:
342
+ mining_recipe["result_count"] = str(count_data["min"])
343
+ elif "max" in count_data:
344
+ mining_recipe["result_count"] = str(count_data["max"])
345
+ else:
346
+ # Single count value
347
+ mining_recipe["result_count"] = str(count_data)
348
+
349
+ # If there is NO_SILK_TOUCH_DROP, add a mining recipe for it
350
+ no_silk_touch_drop: bool = bool(raw_data.get("no_silk_touch_drop", False))
351
+ is_drop_of: list[str] = [
352
+ i for i, d in Mem.definitions.items()
353
+ if d.get("no_silk_touch_drop") and (
354
+ (isinstance(d["no_silk_touch_drop"], str) and d["no_silk_touch_drop"] == name) or
355
+ (isinstance(d["no_silk_touch_drop"], dict) and cast(JsonDict, d["no_silk_touch_drop"]).get("id") == name)
356
+ )
357
+ ]
358
+
359
+ # Add mining recipes for items that are drops from other ores
360
+ content_added: bool = False
361
+ if is_drop_of:
362
+ for ore_name in is_drop_of:
363
+ mining_recipe: JsonDict = {
364
+ "type": "mining",
365
+ "ingredient": ingr_repr(ore_name, Mem.ctx.project_id), # The ore being mined
366
+ "result": ingr_repr(name, Mem.ctx.project_id), # This item is the result
367
+ }
368
+ add_count_to_mining_recipe(mining_recipe, Mem.definitions[ore_name]["no_silk_touch_drop"])
369
+ crafts.insert(0, mining_recipe)
370
+
371
+ # Generate the craft content
372
+ content += generate_craft_content(crafts[0], name, page_font)
373
+ content_added = True
374
+
375
+ # Add mining recipe if this item has no_silk_touch_drop (it's an ore)
376
+ if no_silk_touch_drop:
377
+ no_silk_drop_data: JsonDict | str = raw_data["no_silk_touch_drop"]
378
+ result_format: str = no_silk_drop_data if isinstance(no_silk_drop_data, str) else no_silk_drop_data["id"]
379
+ mining_recipe: JsonDict = {
380
+ "type": "mining",
381
+ "ingredient": ingr_repr(name, Mem.ctx.project_id), # The ore being mined
382
+ "result": ingr_repr(result_format, Mem.ctx.project_id), # Proper ingredient format
383
+ }
384
+ add_count_to_mining_recipe(mining_recipe, no_silk_drop_data)
385
+
386
+ # Insert at position 0 so it appears first and generate the craft content
387
+ crafts.insert(0, mining_recipe)
388
+ if not content_added:
389
+ content += generate_craft_content(crafts[0], name, page_font)
390
+ content_added = True
391
+
392
+ # Else, if there are blue crafts, generate the content for the first craft
393
+ elif not content_added:
394
+ blue_crafts: list[JsonDict] = [craft for craft in crafts if not craft.get("result")]
395
+ if blue_crafts:
396
+ # Sort crafts by result_count in reverse order
397
+ blue_crafts.sort(key=lambda craft: craft.get("result_count", 0), reverse=True)
398
+
399
+ # Get the first craft and generate the content
400
+ content += generate_craft_content(blue_crafts[0], name, page_font)
401
+ content_added = True
402
+
403
+ # Else, generate the content for the single item in a big box
404
+ else:
405
+ if page_font == "":
406
+ page_font = get_page_font(number)
407
+ generate_page_font(name, page_font, craft = None)
408
+ component = get_item_component(name)
409
+ component["text"] = NONE_FONT
410
+ component["text"] *= 2
411
+ content.append({"text": "", "font": FONT, "color": "white"}) # Make default font for every next component
412
+ content.append({"text": titled, "font": "minecraft:default", "color": "black", "underlined": True})
413
+ content.append(MEDIUM_NONE_FONT * 2 + page_font + "\n")
414
+ for _ in range(4):
415
+ content.append(MEDIUM_NONE_FONT * 2)
416
+ content.append(component)
417
+ content.append("\n")
418
+ content_added = True
353
419
 
354
420
  ## Add wiki information if any
355
421
  info_buttons: list[JsonDict] = []
@@ -370,6 +436,7 @@ def routine():
370
436
  })
371
437
 
372
438
  # For each craft (except smelting dupes),
439
+ previous_result: Any = None
373
440
  for i, craft in enumerate(crafts):
374
441
  if craft["type"] == "crafting_shapeless":
375
442
  craft = convert_shapeless_to_shaped(craft)
@@ -394,22 +461,34 @@ def routine():
394
461
  hover_text = [{"text":""}, craft_content]
395
462
 
396
463
  # Add recipe type title
397
- recipe_type_names: dict[str, str] = {
398
- "crafting_shaped": "Shaped Recipe",
399
- "crafting_shapeless": "Shapeless Recipe",
400
- "smelting": "Smelting",
401
- "blasting": "Blasting",
402
- "smoking": "Smoking",
403
- "campfire_cooking": "Campfire Cooking",
404
- "stonecutting": "Stonecutting",
405
- "smithing_transform": "Smithing Transform",
406
- "smithing_trim": "Smithing Trim"
407
- }
408
- recipe_title = recipe_type_names.get(craft["type"], craft["type"].replace("_", " ").title())
409
- hover_text.insert(0, {"text": f"{recipe_title}\n", "color": "yellow"})
464
+ if craft["type"] not in CRAFTING_RECIPES_TYPES:
465
+ recipe_type_names: dict[str, str] = {
466
+ "mining": "Mining",
467
+ "crafting_shaped": "Shaped Recipe",
468
+ "crafting_shapeless": "Shapeless Recipe",
469
+ "smelting": "Smelting",
470
+ "blasting": "Blasting",
471
+ "smoking": "Smoking",
472
+ "campfire_cooking": "Campfire Cooking",
473
+ "stonecutting": "Stonecutting",
474
+ "smithing_transform": "Smithing Transform",
475
+ "smithing_trim": "Smithing Trim",
476
+ PULVERIZING: "SimplEnergy Pulverizing"
477
+ }
478
+ recipe_title = recipe_type_names.get(craft["type"], craft["type"].replace("_", " ").title())
479
+ hover_text.insert(0, {"text": f"{recipe_title}\n", "color": "yellow"})
410
480
 
411
481
  # Append ingredients
412
- if craft.get("ingredient"):
482
+ if craft["type"] == "mining":
483
+ # For mining recipes, show what is being mined and what it drops
484
+ ore_name = ingr_to_id(craft["ingredient"], False).replace("_", " ").title()
485
+ result_name = ingr_to_id(craft["result"], False).replace("_", " ").title()
486
+ hover_text.append({"text": "\n- Mine: ", "color": "gray"})
487
+ hover_text.append({"text": ore_name, "color": "gray"})
488
+ result_count = craft.get("result_count", "1")
489
+ hover_text.append({"text": f"\n- Drops: x{result_count} ", "color": "gray"})
490
+ hover_text.append({"text": result_name, "color": "gray"})
491
+ elif craft.get("ingredient"):
413
492
  id = ingr_to_id(craft["ingredient"], False).replace("_", " ").title()
414
493
  hover_text.append({"text": "\n- x1 ", "color": "gray"})
415
494
  hover_text.append({"text": id, "color": "gray"})
@@ -453,6 +532,12 @@ def routine():
453
532
  hover_text.append({"text": "\n- Pattern: ", "color": "gray"})
454
533
  hover_text.append({"text": pattern_name, "color": "gray"})
455
534
 
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
+
456
541
  # Add the craft to the content
457
542
  result_or_ingredient = WIKI_RESULT_OF_CRAFT_FONT if "result" not in craft else generate_wiki_font_for_ingr(name, craft)
458
543
  info_buttons.append({
@@ -460,33 +545,69 @@ def routine():
460
545
  "hover_event": {
461
546
  "action": "show_text",
462
547
  "value": hover_text
463
- }
548
+ },
549
+ "priority": craft.get("manual_priority", 1)
464
550
  })
465
551
 
466
552
  # If there is a result to the craft, try to add the click_event that change to that page
467
- if "result" in craft:
468
- result_item = ingr_to_id(craft["result"], False)
469
- if result_item in Mem.definitions:
553
+ craft_result: str = "" if "result" not in craft else ingr_to_id(craft["result"], False)
554
+ if craft_result and craft_result != name:
555
+ if craft_result in Mem.definitions:
556
+ info_buttons[-1]["click_event"] = {
557
+ "action": "change_page",
558
+ "page": get_page_number(craft_result)
559
+ }
560
+
561
+ # Else, try to add the click_event that change to that page
562
+ else:
563
+ # If there is only one ingredient, link to it
564
+ craft_ingredient: str = ""
565
+ if craft.get("ingredient"):
566
+ craft_ingredient = ingr_to_id(craft["ingredient"], False)
567
+ elif craft.get("ingredients") and isinstance(craft["ingredients"], list) and len(craft["ingredients"]) == 1:
568
+ craft_ingredient = ingr_to_id(craft["ingredients"][0], False)
569
+ elif craft.get("ingredients") and isinstance(craft["ingredients"], dict) and len(craft["ingredients"]) == 1:
570
+ craft_ingredient = ingr_to_id(next(iter(craft["ingredients"].values())), False)
571
+ if craft_ingredient and craft_ingredient in Mem.definitions and craft_ingredient != name:
470
572
  info_buttons[-1]["click_event"] = {
471
573
  "action": "change_page",
472
- "page": get_page_number(result_item)
574
+ "page": get_page_number(craft_ingredient),
575
+ "blue_craft": craft_result == "" # No result = blue craft
473
576
  }
474
577
 
475
578
  # Add wiki buttons 5 by 5
476
579
  if info_buttons:
477
580
 
478
- # If too many buttons, remove all the blue ones (no click_event) except the last one
479
- if len(info_buttons) > 15:
581
+ # Retrieve buttons limit depending on number of lines in the content (more lines = less buttons)
582
+ buttons_limit: int = 20 if str(content).count("\\n") <= 6 else 15
583
+
584
+ # If too many buttons, remove all the blue ones (blue_craft) except the last one
585
+ if len(info_buttons) > buttons_limit:
480
586
  first_index: int = 0 if not raw_data.get(WIKI_COMPONENT) else 1
481
587
  last_index: int = -1
482
588
  for i, button in enumerate(info_buttons):
483
- if not button.get("click_event") and i != first_index:
589
+ if button.get("click_event", {}).get("blue_craft", False) and i != first_index:
484
590
  last_index = i
485
591
 
486
592
  # If there are more than 1 blue button, remove them except the last one
487
593
  if (last_index - first_index) > 1:
488
594
  info_buttons = info_buttons[:first_index] + info_buttons[last_index:]
489
595
 
596
+ # If there are more than buttons_limit buttons, remove lowest priority ones until there is buttons_limit left
597
+ while len(info_buttons) > buttons_limit:
598
+ lowest_priority: int = min(info_buttons[::-1], key=lambda x: x.get("priority", 1))
599
+ info_buttons.remove(lowest_priority)
600
+
601
+ # Keep only the last buttons_limit buttons (maximum that can be displayed with 5 per line and 4 lines)
602
+ info_buttons = info_buttons[:buttons_limit]
603
+
604
+ for button in info_buttons:
605
+ click_event: JsonDict = button.get("click_event", {})
606
+ if click_event.get("blue_craft", False):
607
+ del click_event["blue_craft"]
608
+ if button.get("priority"):
609
+ del button["priority"]
610
+
490
611
  # Add a breakline only if there aren't too many breaklines already
491
612
  content.append("\n")
492
613
 
@@ -666,11 +787,13 @@ def routine():
666
787
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/furnace.png", "ascent": 1, "height": 58, "chars": [FURNACE_FONT]})
667
788
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/stonecutting.png", "ascent": 4, "height": 58, "chars": [STONECUTTING_FONT]})
668
789
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/pulverizing.png", "ascent": 4, "height": 58, "chars": [PULVERIZING_FONT]})
790
+ SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/mining.png", "ascent": 4, "height": 58, "chars": [MINING_FONT]})
669
791
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/shaped_3x3.png", "ascent": -4, "height": 58, "chars": [HOVER_SHAPED_3X3_FONT]})
670
792
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/shaped_2x2.png", "ascent": -2, "height": 58, "chars": [HOVER_SHAPED_2X2_FONT]})
671
793
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/furnace.png", "ascent": -3, "height": 58, "chars": [HOVER_FURNACE_FONT]})
672
794
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/stonecutting.png", "ascent": -3, "height": 58, "chars": [HOVER_STONECUTTING_FONT]})
673
795
  SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/pulverizing.png", "ascent": -3, "height": 58, "chars": [HOVER_PULVERIZING_FONT]})
796
+ SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/mining.png", "ascent": -3, "height": 58, "chars": [HOVER_MINING_FONT]})
674
797
  fonts = {"providers": SharedMemory.font_providers}
675
798
  with super_open(f"{SharedMemory.cache_path}/font/manual.json", "w") as f:
676
799
  f.write(super_json_dump(fonts))
@@ -14,13 +14,7 @@ from ...core.ingredients import (
14
14
  ingr_repr,
15
15
  ingr_to_id,
16
16
  )
17
- from .shared_import import (
18
- FURNACE_FONT,
19
- PULVERIZING_FONT,
20
- SHAPED_2X2_FONT,
21
- SHAPED_3X3_FONT,
22
- STONECUTTING_FONT,
23
- )
17
+ from .shared_import import FURNACE_FONT, MINING_FONT, PULVERIZING_FONT, SHAPED_2X2_FONT, SHAPED_3X3_FONT, STONECUTTING_FONT
24
18
 
25
19
 
26
20
  # Convert craft function
@@ -101,6 +95,8 @@ def high_res_font_from_craft(craft: JsonDict) -> str:
101
95
  return PULVERIZING_FONT
102
96
  elif craft["type"] == "stonecutting":
103
97
  return STONECUTTING_FONT
98
+ elif craft["type"] == "mining":
99
+ return MINING_FONT
104
100
  else:
105
101
  return ""
106
102
 
@@ -202,9 +202,12 @@ def generate_wiki_font_for_ingr(name: str, craft: JsonDict) -> str:
202
202
  item_texture = careful_resize(item_texture, item_res_adjusted)
203
203
  item_texture = item_texture.convert("RGBA")
204
204
 
205
- # Load the template and paste the texture on it
206
- template = Image.open(f"{TEMPLATES_PATH}/wiki_ingredient_of_craft_template.png")
205
+ # Load the template
206
+ filename: str = "wiki_ingredient_of_craft_template.png" if craft["type"] != "mining" else "wiki_mining_template.png"
207
+ template = Image.open(f"{TEMPLATES_PATH}/{filename}")
207
208
  template = careful_resize(template, item_res)
209
+
210
+ # Paste the texture on it
208
211
  offset = (item_res - item_res_adjusted) // 2
209
212
  template.paste(item_texture, (offset, offset), item_texture)
210
213