stewbeet 3.3.2__tar.gz → 3.4.0__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.
Files changed (342) hide show
  1. {stewbeet-3.3.2 → stewbeet-3.4.0}/PKG-INFO +5 -5
  2. {stewbeet-3.3.2 → stewbeet-3.4.0}/pyproject.toml +5 -5
  3. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/__init__.py +1 -0
  4. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/__init__.pyi +1 -0
  5. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/cli.py +16 -3
  6. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/cables.py +133 -18
  7. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/__memory__.py +7 -3
  8. stewbeet-3.4.0/stewbeet/core/__memory__.pyi +10 -0
  9. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/ingredients.py +0 -1
  10. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/completion.py +12 -13
  11. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/completion.pyi +0 -2
  12. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/simplenergy.py +1 -3
  13. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/simplenergy.pyi +0 -1
  14. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/text.py +3 -3
  15. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/text.pyi +3 -3
  16. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/utils/text_component.py +0 -4
  17. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/download_manager.py +18 -20
  18. stewbeet-3.4.0/stewbeet/plugins/archive/__init__.py +156 -0
  19. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/lang_file/utils.py +4 -0
  20. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/dependencies/__init__.py +1 -1
  21. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/__init__.py +57 -0
  22. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/api.py +58 -0
  23. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/assets/home.png +0 -0
  24. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/assets/wiki_growing_seed.png +0 -0
  25. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/button_layout.py +73 -0
  26. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/config.py +133 -0
  27. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/dialog.py +185 -0
  28. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/glyphs.py +156 -0
  29. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/images.py +320 -0
  30. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/iso_renders.py +73 -27
  31. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/manual.py +491 -0
  32. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/manual_emit.py +204 -0
  33. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/book_optimizer.py → stewbeet-3.4.0/stewbeet/plugins/ingame_manual/optimizer.py +27 -46
  34. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/__init__.py +25 -0
  35. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/base.py +70 -0
  36. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/browser_page.py +98 -0
  37. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/button_layout.py +8 -0
  38. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/category_page.py +98 -0
  39. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/custom_page.py +42 -0
  40. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/intro_page.py +46 -0
  41. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/item_page.py +264 -0
  42. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/raw_page.py +32 -0
  43. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/pages/texture_page.py +54 -0
  44. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/paths.py +15 -0
  45. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/__init__.py +22 -0
  46. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/buttons.py +35 -0
  47. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/collection.py +215 -0
  48. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/components.py +112 -0
  49. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/hovers.py +61 -0
  50. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/registry.py +88 -0
  51. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/renderer.py +230 -0
  52. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/__init__.py +5 -0
  53. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/awakened_forge.py +142 -0
  54. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/furnace.py +105 -0
  55. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/linear.py +87 -0
  56. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/shaped.py +166 -0
  57. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/recipes/types/smithing.py +80 -0
  58. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/refs.py +30 -0
  59. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/showcase.py +97 -0
  60. stewbeet-3.4.0/stewbeet/plugins/ingame_manual/special.py +69 -0
  61. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/initialize/__init__.py +10 -0
  62. stewbeet-3.4.0/stewbeet/plugins/merge_smithed_weld/__init__.py +54 -0
  63. stewbeet-3.4.0/stewbeet/plugins/merge_smithed_weld/weld.py +150 -0
  64. stewbeet-3.4.0/stewbeet/plugins/verify_definitions/__init__.py +12 -0
  65. stewbeet-3.3.2/stewbeet/core/__memory__.pyi +0 -9
  66. stewbeet-3.3.2/stewbeet/plugins/archive/__init__.py +0 -117
  67. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/__init__.py +0 -60
  68. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/book_components.py +0 -139
  69. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/craft_content.py +0 -442
  70. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/dialog.py +0 -223
  71. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/image_utils.py +0 -173
  72. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/main.py +0 -1058
  73. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/other_utils.py +0 -211
  74. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/page_font.py +0 -230
  75. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/shared_import.py +0 -144
  76. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/showcase_image.py +0 -161
  77. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/stardust_forge.py +0 -32
  78. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -1
  79. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/1book.png +0 -0
  80. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/_README.md +0 -5
  81. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/awakened_forge_1.png +0 -0
  82. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/awakened_forge_2.png +0 -0
  83. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x3.png +0 -0
  84. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x4.png +0 -0
  85. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/book.png +0 -0
  86. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/donut_holer.png +0 -0
  87. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  88. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  89. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  90. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  91. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  92. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
  93. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  94. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  95. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  96. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  97. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  98. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  99. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
  100. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  101. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  102. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  103. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
  104. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  105. stewbeet-3.3.2/stewbeet/plugins/ingame_manual/text_components.py +0 -48
  106. stewbeet-3.3.2/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -43
  107. stewbeet-3.3.2/stewbeet/plugins/merge_smithed_weld/weld.py +0 -186
  108. stewbeet-3.3.2/stewbeet/plugins/verify_definitions/__init__.py +0 -356
  109. stewbeet-3.3.2/stewbeet/plugins/verify_definitions/silent.py +0 -11
  110. {stewbeet-3.3.2 → stewbeet-3.4.0}/LICENSE +0 -0
  111. {stewbeet-3.3.2 → stewbeet-3.4.0}/README.md +0 -0
  112. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/__main__.py +0 -0
  113. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/all/__init__.py +0 -0
  114. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/all/__init__.pyi +0 -0
  115. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/all/silent.py +0 -0
  116. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/all/silent.pyi +0 -0
  117. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/cli.pyi +0 -0
  118. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/__init__.py +0 -0
  119. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/__init__.pyi +0 -0
  120. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  121. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/cd_utils.pyi +0 -0
  122. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/github.py +0 -0
  123. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/github.pyi +0 -0
  124. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/modrinth.py +0 -0
  125. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/modrinth.pyi +0 -0
  126. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/pmc.py +0 -0
  127. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/pmc.pyi +0 -0
  128. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/smithed.py +0 -0
  129. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/continuous_delivery/smithed.pyi +0 -0
  130. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  131. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  132. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  133. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  134. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  135. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  136. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  137. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  138. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  139. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  140. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  141. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  142. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  143. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  144. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  145. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  146. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  147. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  148. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  149. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  150. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  151. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  152. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  153. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  154. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  155. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  156. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  157. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  158. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  159. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  160. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  161. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  162. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  163. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  164. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  165. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  166. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  167. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  168. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  169. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  170. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  171. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  172. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  173. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  174. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  175. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  176. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  177. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  178. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  179. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  180. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  181. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  182. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  183. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  184. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  185. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  186. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  187. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  188. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  189. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  190. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  191. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  192. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  193. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  194. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  195. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  196. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  197. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  198. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/gui.py +0 -0
  199. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  200. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  201. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/py.typed +0 -0
  202. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
  203. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
  204. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
  205. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
  206. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
  207. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
  208. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
  209. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
  210. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  211. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/__init__.py +0 -0
  212. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/__init__.pyi +0 -0
  213. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/_recipe_list.py +0 -0
  214. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/_utils.py +0 -0
  215. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/block.py +0 -0
  216. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/external_item.py +0 -0
  217. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/item.py +0 -0
  218. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/painting.py +0 -0
  219. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/recipe.py +0 -0
  220. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/cls/wiki_button.py +0 -0
  221. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/constants.py +0 -0
  222. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/constants.pyi +0 -0
  223. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/__init__.py +0 -0
  224. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/__init__.pyi +0 -0
  225. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/equipments.py +0 -0
  226. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/equipments.pyi +0 -0
  227. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/materials.py +0 -0
  228. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/materials.pyi +0 -0
  229. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/records.py +0 -0
  230. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/records.pyi +0 -0
  231. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  232. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/definitions_helper/smart_ore_generation.pyi +0 -0
  233. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/dump.py +0 -0
  234. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/dump.pyi +0 -0
  235. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/migrate.py +0 -0
  236. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/migrate.pyi +0 -0
  237. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/template.py +0 -0
  238. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/template.pyi +0 -0
  239. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/utils/equation.py +0 -0
  240. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/utils/io.py +0 -0
  241. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/utils/loot_table.py +0 -0
  242. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/core/utils/sounds.py +0 -0
  243. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/__init__.py +0 -0
  244. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/__init__.pyi +0 -0
  245. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/download_manager.pyi +0 -0
  246. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/official_libs.py +0 -0
  247. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/dependencies/official_libs.pyi +0 -0
  248. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/archive/silent.py +0 -0
  249. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  250. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
  251. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
  252. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
  253. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/macro_analyzer.py +0 -0
  254. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/macro_parser.py +0 -0
  255. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/object.py +0 -0
  256. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/silent.py +0 -0
  257. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/headers/type_inference.py +0 -0
  258. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  259. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/lang_file/silent.py +0 -0
  260. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/scoreboard_constants/__init__.py +0 -0
  261. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/auto/scoreboard_constants/silent.py +0 -0
  262. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  263. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compatibilities/neo_enchant/silent.py +0 -0
  264. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  265. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compatibilities/simpledrawer/silent.py +0 -0
  266. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  267. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/compute_sha1/silent.py +0 -0
  268. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  269. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/copy_to_destination/silent.py +0 -0
  270. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_paintings/__init__.py +0 -0
  271. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_paintings/silent.py +0 -0
  272. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  273. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/awakened_forge.py +0 -0
  274. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  275. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  276. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/silent.py +0 -0
  277. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  278. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  279. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  280. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/custom_blocks/silent.py +0 -0
  281. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  282. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/loading/silent.py +0 -0
  283. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  284. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/loot_tables/silent.py +0 -0
  285. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
  286. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
  287. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
  288. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/match.py +0 -0
  289. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
  290. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
  291. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
  292. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/datapack/sorters/silent.py +0 -0
  293. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  294. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/basic_datapack_structure/silent.py +0 -0
  295. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  296. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/check_unused_textures/silent.py +0 -0
  297. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  298. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/custom_blocks_ticking/silent.py +0 -0
  299. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/dependencies/silent.py +0 -0
  300. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  301. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/last_final/silent.py +0 -0
  302. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/unload/__init__.py +0 -0
  303. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/finalyze/unload/silent.py +0 -0
  304. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/awakened_forge_1.png +0 -0
  305. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/awakened_forge_2.png +0 -0
  306. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x3.png +0 -0
  307. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x4.png +0 -0
  308. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/book.png +0 -0
  309. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  310. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  311. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  312. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  313. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  314. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
  315. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  316. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  317. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  318. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  319. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  320. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  321. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
  322. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  323. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  324. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  325. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
  326. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  327. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/initialize/silent.py +0 -0
  328. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  329. {stewbeet-3.3.2/stewbeet/plugins/ingame_manual → stewbeet-3.4.0/stewbeet/plugins/merge_smithed_weld}/silent.py +0 -0
  330. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  331. {stewbeet-3.3.2/stewbeet/plugins/merge_smithed_weld → stewbeet-3.4.0/stewbeet/plugins/resource_pack/check_power_of_2}/silent.py +0 -0
  332. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  333. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  334. {stewbeet-3.3.2/stewbeet/plugins/resource_pack/check_power_of_2 → stewbeet-3.4.0/stewbeet/plugins/resource_pack/item_models}/silent.py +0 -0
  335. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  336. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/plugins/resource_pack/sounds/silent.py +0 -0
  337. {stewbeet-3.3.2/stewbeet/plugins/resource_pack/item_models → stewbeet-3.4.0/stewbeet/plugins/verify_definitions}/silent.py +0 -0
  338. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/py.typed +0 -0
  339. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/silent.py +0 -0
  340. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/silent.pyi +0 -0
  341. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/utils.py +0 -0
  342. {stewbeet-3.3.2 → stewbeet-3.4.0}/stewbeet/utils.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 3.3.2
3
+ Version: 3.4.0
4
4
  Summary: Beet Framework made to help generating advanced Minecraft datapack contents
5
5
  Author: Stoupy51
6
6
  Author-email: Stoupy51 <stoupy51@gmail.com>
@@ -10,12 +10,12 @@ Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.14
11
11
  Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Operating System :: OS Independent
13
- Requires-Dist: stouputils>=1.29.0
13
+ Requires-Dist: stouputils>=1.29.3
14
14
  Requires-Dist: model-resolver>=1.15.2
15
- Requires-Dist: beet>=0.115.0
15
+ Requires-Dist: beet>=0.116.0
16
16
  Requires-Dist: bolt>=0.50.1
17
- Requires-Dist: mecha>=0.103.0
18
- Requires-Dist: mutagen>=1.47.0
17
+ Requires-Dist: mecha>=0.104.0
18
+ Requires-Dist: mutagen>=1.48.1
19
19
  Requires-Dist: pyperclip>=1.11.0
20
20
  Requires-Dist: fsspec>=2026.6.0
21
21
  Requires-Dist: paramiko>=5.0.0
@@ -8,7 +8,7 @@ module-root = ""
8
8
 
9
9
  [project]
10
10
  name = "stewbeet"
11
- version = "3.3.2"
11
+ version = "3.4.0"
12
12
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
13
13
  readme = "README.md"
14
14
  license = "MIT"
@@ -24,12 +24,12 @@ authors = [
24
24
  { name = "Stoupy51", email = "stoupy51@gmail.com" },
25
25
  ]
26
26
  dependencies = [
27
- "stouputils>=1.29.0",
27
+ "stouputils>=1.29.3",
28
28
  "model_resolver>=1.15.2",
29
- "beet>=0.115.0",
29
+ "beet>=0.116.0",
30
30
  "bolt>=0.50.1",
31
- "mecha>=0.103.0",
32
- "mutagen>=1.47.0",
31
+ "mecha>=0.104.0",
32
+ "mutagen>=1.48.1",
33
33
  "pyperclip>=1.11.0",
34
34
  "fsspec>=2026.6.0",
35
35
  "paramiko>=5.0.0",
@@ -8,6 +8,7 @@ from beet import *
8
8
 
9
9
  from .cli import main
10
10
  from .core import *
11
+ from .plugins.ingame_manual.api import *
11
12
  from .plugins.initialize.source_lore_font import find_pack_png
12
13
  from .plugins.resource_pack.item_models.object import AutoModel
13
14
  from .plugins.resource_pack.sounds import add_sound
@@ -1,5 +1,6 @@
1
1
  from beet import *
2
2
  from .core import *
3
+ from .plugins.ingame_manual.api import *
3
4
  from .cli import main as main
4
5
  from .plugins.initialize.source_lore_font import find_pack_png as find_pack_png
5
6
  from .plugins.resource_pack.item_models.object import AutoModel as AutoModel
@@ -3,7 +3,6 @@
3
3
  import importlib
4
4
  import os
5
5
  import shutil
6
- import subprocess
7
6
  import sys
8
7
 
9
8
  import stouputils as stp
@@ -81,7 +80,12 @@ def main() -> None:
81
80
  stp.info("Cleaning project and caches...")
82
81
 
83
82
  # Remove the beet cache directory
84
- subprocess.run([sys.executable, "-m", "beet", "cache", "-c"], check=False, capture_output=True)
83
+ try:
84
+ from beet.toolchain.project import Project
85
+ project = Project(resolved_config=cfg)
86
+ project.clear_cache([])
87
+ except Exception:
88
+ pass
85
89
  if os.path.exists(".beet_cache"):
86
90
  shutil.rmtree(".beet_cache", ignore_errors=True)
87
91
 
@@ -120,10 +124,19 @@ def main() -> None:
120
124
  def stop_callback(exception: BaseException) -> None:
121
125
  sys.exit(1)
122
126
 
123
- # Try to import all pipeline
127
+ # Try to import all pipeline (upfront, only for nice error messages)
128
+ modules_before: set[str] = set(sys.modules)
124
129
  for plugin in cfg.pipeline:
125
130
  stp.handle_error(importlib.import_module, error_log=stp.LogLevels.WARNING_TRACEBACK, callback=stop_callback)(plugin)
126
131
 
132
+ # Forget project-local modules so beet re-imports them in its own tracked
133
+ # region, else `stewbeet watch` ignores edits to project source files.
134
+ for name in set(sys.modules) - modules_before:
135
+ module = sys.modules.get(name)
136
+ filename: str | None = getattr(module, "__file__", None)
137
+ if filename and "site-packages" not in filename and filename.startswith(current_dir):
138
+ del sys.modules[name]
139
+
127
140
  # Run beet with all remaining arguments
128
141
  from beet.toolchain.cli import main as beet_main
129
142
  beet_main()
@@ -4,9 +4,10 @@
4
4
  import os
5
5
 
6
6
  import stouputils as stp
7
- from beet import ItemModel, Model
7
+ from beet import ItemModel, Model, Texture
8
+ from PIL import Image
8
9
 
9
- from ...core import CUSTOM_ITEM_VANILLA, Item, JsonDict, Mem, set_json_encoder, texture_mcmeta, write_function
10
+ from ...core import Item, JsonDict, Mem, set_json_encoder, texture_mcmeta, write_advancement, write_function, write_load_file
10
11
 
11
12
  # Constants
12
13
  ENERGY_CABLE_MODELS_FOLDER: str = stp.get_root_path(__file__) + "/energy_cable_models"
@@ -81,7 +82,7 @@ tag @s add {ns}.cable
81
82
 
82
83
  # Update_cable_model function
83
84
  cables_str: str = "\n".join([
84
- f"execute if entity @s[tag={ns}.{cable}] run item replace entity @s contents with {CUSTOM_ITEM_VANILLA}[item_model=\"{ns}:{cable}\"]"
85
+ f"execute if entity @s[tag={ns}.{cable}] run item replace entity @s contents with {Item.base_item}[item_model=\"{ns}:{cable}\"]"
85
86
  for cable in cables
86
87
  ])
87
88
  cable_update_content: str = f"""
@@ -202,7 +203,7 @@ function #itemio:calls/cables/destroy
202
203
 
203
204
  # Update cable_model function
204
205
  cables_str: str = "\n".join([
205
- f"execute if entity @s[tag={ns}.{cable}] run item replace entity @s contents with {CUSTOM_ITEM_VANILLA}[item_model=\"{ns}:{cable}\"]"
206
+ f"execute if entity @s[tag={ns}.{cable}] run item replace entity @s contents with {Item.base_item}[item_model=\"{ns}:{cable}\"]"
206
207
  for cable in cables
207
208
  ])
208
209
  cable_update_content: str = f"""
@@ -262,14 +263,21 @@ def servo_mechanisms_models(servos: dict[str, dict[str, str] | None]) -> None:
262
263
  connected_model["textures"] = {"0": f"{ns}:block/{connected_texture}", "particle": f"{ns}:block/{connected_texture}"}
263
264
  Mem.ctx.assets[ns].models[f"block/servo/{typ}_connected"] = set_json_encoder(Model(connected_model), max_level=3)
264
265
 
266
+ # Register the off model (grayed out version of the default texture, shown when the servo is disabled)
267
+ off_texture: str = f"servo/{typ}_off"
268
+ off_model: JsonDict = stp.json_load(f"{models_path}/{typ}_block.json")
269
+ off_model["parent"] = f"{ns}:block/servo/base_block"
270
+ off_model["textures"] = {"0": f"{ns}:block/{off_texture}", "particle": f"{ns}:block/{off_texture}"}
271
+ Mem.ctx.assets[ns].models[f"block/servo/{typ}_off"] = set_json_encoder(Model(off_model), max_level=3)
272
+
265
273
  # Register the item model
266
274
  item_model: JsonDict = stp.json_load(f"{models_path}/{typ}_item.json")
267
275
  item_model["parent"] = f"{ns}:block/servo/base_item"
268
276
  item_model["textures"] = {"0": f"{ns}:block/{default_texture}", "particle": f"{ns}:block/{default_texture}"}
269
277
  Mem.ctx.assets[ns].models[f"block/servo/{typ}_item"] = set_json_encoder(Model(item_model), max_level=3)
270
278
 
271
- # Register two items file (for default and connected)
272
- for texture in ("block", "connected"):
279
+ # Register items files (for default, connected and off)
280
+ for texture in ("block", "connected", "off"):
273
281
  model_data = {
274
282
  "model": {
275
283
  "type": "minecraft:model",
@@ -288,6 +296,17 @@ def servo_mechanisms_models(servos: dict[str, dict[str, str] | None]) -> None:
288
296
  if os.path.exists(src) and (not Mem.ctx.assets[ns].textures.get(dst)):
289
297
  Mem.ctx.assets[ns].textures[dst] = texture_mcmeta(src)
290
298
 
299
+ # Generate the grayed out "off" texture from the default texture (desaturated and darkened)
300
+ off_dst: str = f"block/{off_texture}"
301
+ default_src: str = f"{textures_folder}/{textures.get('default', f'{typ}_default')}.png"
302
+ if os.path.exists(default_src) and (not Mem.ctx.assets[ns].textures.get(off_dst)):
303
+ with Image.open(default_src) as base_image:
304
+ rgba: Image.Image = base_image.convert("RGBA")
305
+ r, g, b, a = rgba.split()
306
+ gray = Image.merge("RGB", (r, g, b)).convert("L").point(lambda p: int(p * 0.5))
307
+ off_image: Image.Image = Image.merge("RGBA", (gray, gray, gray, a))
308
+ Mem.ctx.assets[ns].textures[off_dst] = Texture(off_image)
309
+
291
310
  ## Working functions
292
311
  # On placement, add necessary tag and call init function
293
312
  item = Item.from_id(servo)
@@ -301,6 +320,7 @@ tag @s add itemio.servo
301
320
  tag @s add {ns}.servo
302
321
  scoreboard players set @s itemio.servo.stack_limit {stack_limit}
303
322
  scoreboard players set @s itemio.servo.retry_limit {retry_limit}
323
+ scoreboard players set @s {ns}.servo_off 0
304
324
  function #itemio:calls/servos/init
305
325
  """)
306
326
  # On destruction, call destroy function of itemio
@@ -309,22 +329,117 @@ function #itemio:calls/servos/init
309
329
  function #itemio:calls/servos/destroy
310
330
  """)
311
331
 
312
- # Update servo_model function
313
- servo_update_content: str = f"""
332
+ # Update the servo model on itemio network changes (delegates to the shared model logic)
333
+ write_function(f"{ns}:calls/itemio/network_update", f"""
314
334
  # Stop if not {ns} servo
315
335
  execute unless entity @s[tag={ns}.custom_block,tag={ns}.servo] run return fail
316
336
 
317
- # Apply the model dynamically based on servo tags and itemio.math score
318
- """
319
- for servo, textures in servos.items():
320
- if textures is None:
321
- textures = {}
322
- typ: str = textures.get("type", "extract")
337
+ # Apply the model depending on the on/off state and the network connection
338
+ function {ns}:utils/servo/update_model
339
+ """, tags=["itemio:event/network_update"])
340
+
341
+ # Setup the "rotate to toggle on/off" feature
342
+ servo_toggle(servos)
343
+ return
344
+
345
+
346
+ # Setup the ability to turn servos off and on by rotating (right-clicking) them
347
+ def servo_toggle(servos: dict[str, dict[str, str] | None]) -> None:
348
+ """ Setup the functions allowing players to turn servo mechanisms off and on by rotating them.
349
+
350
+ Rotating (right-clicking) a servo item frame changes its 'ItemRotation'. A vanilla advancement listening to
351
+ the 'minecraft:player_interacted_with_entity' trigger detects the interaction (so nothing runs every tick),
352
+ then the nearby servos are checked: an odd rotation disables the rotated one (grayed out texture, item
353
+ transfers stopped by removing the 'itemio.servo.extract' / 'itemio.servo.insert' tag), an even rotation
354
+ enables it back to normal. As the check only acts when the parity differs, only the rotated servo toggles.
355
+
356
+ Args:
357
+ servos (dict[str, dict[str, str]]): Same servos dictionary as the one passed to 'servo_mechanisms_models'.
358
+ """
359
+ ns: str = Mem.ctx.project_id
360
+ servo_types: dict[str, str] = {servo: (textures or {}).get("type", "extract") for servo, textures in servos.items()}
361
+
362
+ # Score holding the on/off state of each servo (created at load time)
363
+ write_load_file(f"\n# Score for the on/off state of servo mechanisms\nscoreboard objectives add {ns}.servo_off dummy\n")
364
+
365
+ # Advancement detecting the interaction with a servo item frame, then revoked and handled by a function
366
+ write_advancement(f"{ns}:technical/servo_toggle", {
367
+ "criteria": {
368
+ "requirement": {
369
+ "trigger": "minecraft:player_interacted_with_entity",
370
+ "conditions": {
371
+ "entity": {
372
+ "minecraft:entity_tags": {"any_of": [f"{ns}.servo"]},
373
+ },
374
+ },
375
+ },
376
+ },
377
+ "requirements": [["requirement"]],
378
+ "rewards": {"function": f"{ns}:utils/servo/on_interact"},
379
+ })
380
+
381
+ # Reward function: revoke the advancement, then check the servos around the player (only the rotated one toggles)
382
+ write_function(f"{ns}:utils/servo/on_interact", f"""
383
+ # Revoke the advancement so it can trigger again
384
+ advancement revoke @s only {ns}:technical/servo_toggle
385
+
386
+ # Check the servos within reach (the change detection makes it a no-op for the ones that did not rotate)
387
+ execute as @e[tag={ns}.servo,distance=..24] run function {ns}:utils/servo/check
388
+ """)
389
+
390
+ # Check the rotation parity and apply the on/off state only when it changed
391
+ write_function(f"{ns}:utils/servo/check", f"""
392
+ # Compute the rotation parity (0 = on, 1 = off)
393
+ scoreboard players set #two {ns}.data 2
394
+ execute store result score #parity {ns}.data run data get entity @s ItemRotation
395
+ scoreboard players operation #parity {ns}.data %= #two {ns}.data
396
+
397
+ # Keep the servo visually aligned while on (any even rotation is normalized to 0)
398
+ execute if score #parity {ns}.data matches 0 unless data entity @s {{ItemRotation:0b}} run data modify entity @s ItemRotation set value 0b
399
+
400
+ # Apply the state only when the parity differs from the current state
401
+ execute if score #parity {ns}.data matches 0 unless score @s {ns}.servo_off matches 0 run function {ns}:utils/servo/enable
402
+ execute if score #parity {ns}.data matches 1 unless score @s {ns}.servo_off matches 1 run function {ns}:utils/servo/disable
403
+ """)
404
+
405
+ # Enable: allow item transfers again by adding back the servo tag, then restore the normal model
406
+ enable_tags: str = "\n".join(
407
+ f"execute if entity @s[tag={ns}.{servo}] run tag @s add itemio.servo.{typ}"
408
+ for servo, typ in servo_types.items()
409
+ )
410
+ write_function(f"{ns}:utils/servo/enable", f"""
411
+ # Mark the servo as on and allow item transfers again
412
+ scoreboard players set @s {ns}.servo_off 0
413
+ {enable_tags}
414
+
415
+ # Restore the normal model and play feedback
416
+ function {ns}:utils/servo/update_model
417
+ playsound minecraft:block.lever.click block @a[distance=..16] ~ ~ ~ 0.6 1.2
418
+ """)
419
+
420
+ # Disable: stop item transfers by removing the servo tag, then apply the grayed out model
421
+ write_function(f"{ns}:utils/servo/disable", f"""
422
+ # Mark the servo as off and stop item transfers
423
+ scoreboard players set @s {ns}.servo_off 1
424
+ tag @s remove itemio.servo.extract
425
+ tag @s remove itemio.servo.insert
426
+
427
+ # Apply the grayed out model and play feedback
428
+ function {ns}:utils/servo/update_model
429
+ playsound minecraft:block.lever.click block @a[distance=..16] ~ ~ ~ 0.6 0.7
430
+ """)
431
+
432
+ # Shared model logic: grayed out when off, normal (depending on the network connection) when on
433
+ model_lines: list[str] = [
434
+ f'execute if score @s {ns}.servo_off matches 1 if entity @s[tag={ns}.{servo}] run data modify entity @s Item.components."minecraft:item_model" set value "{ns}:servo/{typ}_off"'
435
+ for servo, typ in servo_types.items()
436
+ ]
437
+ for servo, typ in servo_types.items():
323
438
  for number, texture in ((0, "block"), (1, "connected")):
324
- servo_update_content += (
325
- f'execute if score @s itemio.math matches {number} if entity @s[tag={ns}.{servo}] run '
326
- f'data modify entity @s Item.components."minecraft:item_model" set value "{ns}:servo/{typ}_{texture}"\n'
439
+ model_lines.append(
440
+ f'execute if score @s {ns}.servo_off matches 0 if score @s itemio.math matches {number} if entity @s[tag={ns}.{servo}] run '
441
+ f'data modify entity @s Item.components."minecraft:item_model" set value "{ns}:servo/{typ}_{texture}"'
327
442
  )
328
- write_function(f"{ns}:calls/itemio/network_update", servo_update_content, tags=["itemio:event/network_update"])
443
+ write_function(f"{ns}:utils/servo/update_model", "\n".join(model_lines) + "\n")
329
444
  return
330
445
 
@@ -5,9 +5,9 @@
5
5
  from typing import TYPE_CHECKING
6
6
 
7
7
  from beet import Context
8
- from stouputils.typing import JsonDict
9
8
 
10
9
  if TYPE_CHECKING:
10
+ from ..plugins.ingame_manual.manual import Manual
11
11
  from .cls.external_item import ExternalItem
12
12
  from .cls.item import Item
13
13
 
@@ -18,9 +18,13 @@ class Mem:
18
18
  """ Global context object that holds the beet project configuration.
19
19
  This is set during plugins.initialize and used throughout the codebase. """
20
20
 
21
- definitions: dict[str, JsonDict | Item] = {}
21
+ definitions: dict[str, Item] = {}
22
22
  """ JsonDict storing all item and block definitions for the project. """
23
23
 
24
- external_definitions: dict[str, JsonDict | ExternalItem] = {}
24
+ external_definitions: dict[str, ExternalItem] = {}
25
25
  """ Secondary JsonDict for storing external items or blocks most likely for recipes. """
26
26
 
27
+ manual: Manual | None = None
28
+ """ The ingame_manual Manual handle, used to register pages/hooks during setup.
29
+ Created lazily via stewbeet.get_manual(); reset after each build (for `beet watch`). """
30
+
@@ -0,0 +1,10 @@
1
+ from ..plugins.ingame_manual.manual import Manual as Manual
2
+ from .cls.external_item import ExternalItem as ExternalItem
3
+ from .cls.item import Item as Item
4
+ from beet import Context as Context
5
+
6
+ class Mem:
7
+ ctx: Context
8
+ definitions: dict[str, Item]
9
+ external_definitions: dict[str, ExternalItem]
10
+ manual: Manual | None
@@ -137,7 +137,6 @@ class Ingr(dict[str, Any]):
137
137
  return namespace + ":" + id
138
138
  return id
139
139
 
140
- @stp.simple_cache
141
140
  def to_name(self) -> str:
142
141
  """ Get the name of the ingredient, ex: "Stick" or "Adamantium Ingot" """
143
142
  return item_id_to_name(self.to_id(add_namespace=True))
@@ -7,8 +7,6 @@ from beet.core.utils import TextComponent
7
7
  from stouputils.typing import JsonDict
8
8
 
9
9
  from ..__memory__ import Mem
10
- from ..cls.external_item import ExternalItem
11
- from ..cls.item import Item
12
10
 
13
11
 
14
12
  # Add item model component
@@ -22,8 +20,7 @@ def add_item_model_component(black_list: list[str] | None = None) -> None:
22
20
  if black_list is None:
23
21
  black_list = []
24
22
  for item, data in Mem.definitions.items():
25
- if isinstance(data, Item):
26
- data = data.components
23
+ data = data.components
27
24
  if item in black_list or data.get("item_model", None) is not None:
28
25
  continue
29
26
  data["item_model"] = f"{Mem.ctx.project_id}:{item}"
@@ -47,8 +44,7 @@ def add_item_name_and_lore_if_missing(is_external: bool = False, black_list: lis
47
44
  for item, data in defs.items():
48
45
  if item in black_list:
49
46
  continue
50
- if isinstance(data, Item | ExternalItem):
51
- data = data.components
47
+ data = data.components
52
48
 
53
49
  # Add item name if none
54
50
  if not data.get("item_name"):
@@ -95,8 +91,7 @@ def add_private_custom_data_for_namespace(is_external: bool = False, black_list:
95
91
  for item, data in defs.items():
96
92
  if item in black_list:
97
93
  continue
98
- if isinstance(data, Item | ExternalItem):
99
- data = data.components
94
+ data = data.components
100
95
  custom_data: JsonDict = data.setdefault("custom_data", {})
101
96
  if is_external and ":" in item:
102
97
  ns, id = item.split(":")
@@ -118,9 +113,7 @@ def add_smithed_ignore_vanilla_behaviours_convention() -> None:
118
113
  Refer to https://wiki.smithed.dev/conventions/tag-specification/#custom-items for more information.
119
114
  """
120
115
  for data in Mem.definitions.values():
121
- if isinstance(data, Item):
122
- data = data.components
123
- smithed_ignore: JsonDict = data.setdefault("custom_data", {}).setdefault("smithed", {}).setdefault("ignore", {})
116
+ smithed_ignore: JsonDict = data.components.setdefault("custom_data", {}).setdefault("smithed", {}).setdefault("ignore", {})
124
117
  smithed_ignore.setdefault("functionality", True)
125
118
  smithed_ignore.setdefault("crafting", True)
126
119
 
@@ -133,8 +126,14 @@ def set_manual_components(white_list: list[str]) -> None:
133
126
  """
134
127
  if not white_list:
135
128
  return
136
- from ...plugins.ingame_manual.shared_import import SharedMemory
137
- SharedMemory.components_to_include = white_list
129
+
130
+ # v2 plugin (ingame_manual): record an override picked up by ManualConfig.from_meta,
131
+ # and update any Manual already created during setup.
132
+ from ...plugins.ingame_manual import config as v2_config
133
+ v2_config.COMPONENTS_OVERRIDE = list(white_list)
134
+ from ...core.__memory__ import Mem
135
+ if Mem.manual is not None:
136
+ Mem.manual.config.components_to_include = list(white_list)
138
137
 
139
138
  # Export all definitions to JSON
140
139
  def export_all_definitions_to_json(file_name: str, is_external: bool | JsonDict = False, verbose: bool = True) -> None:
@@ -1,6 +1,4 @@
1
1
  from ..__memory__ import Mem as Mem
2
- from ..cls.external_item import ExternalItem as ExternalItem
3
- from ..cls.item import Item as Item
4
2
  from beet.core.utils import TextComponent as TextComponent
5
3
  from stouputils.typing import JsonDict as JsonDict
6
4
 
@@ -3,7 +3,6 @@
3
3
  from beet.core.utils import TextComponent
4
4
 
5
5
  from ..__memory__ import Mem
6
- from ..cls.item import Item
7
6
 
8
7
 
9
8
  def format_energy_number(number: int) -> str:
@@ -58,8 +57,7 @@ def create_energy_lore(energy_data: dict[str, int]) -> TextComponent:
58
57
  def add_energy_lore_to_definitions():
59
58
  """ Adds energy-related lore to definitions based on their custom data. """
60
59
  for data in Mem.definitions.values():
61
- if isinstance(data, Item):
62
- data = data.components
60
+ data = data.components
63
61
  if "energy" in data.get("custom_data", {}):
64
62
  data["lore"] = data.get("lore", []) + create_energy_lore(data["custom_data"]["energy"])
65
63
 
@@ -1,5 +1,4 @@
1
1
  from ..__memory__ import Mem as Mem
2
- from ..cls.item import Item as Item
3
2
  from beet.core.utils import TextComponent as TextComponent
4
3
 
5
4
  def format_energy_number(number: int) -> str:
@@ -5,13 +5,13 @@ from stouputils.typing import JsonDict
5
5
 
6
6
 
7
7
  # Functions
8
- def create_gradient_text(text: str, start_hex: str = "c24a17", end_hex: str = "c77e36", text_length: int | None = None) -> list[JsonDict]:
8
+ def create_gradient_text(text: str, start_hex: str = "#c24a17", end_hex: str = "#c77e36", text_length: int | None = None) -> list[JsonDict]:
9
9
  """ Create a gradient text effect by interpolating colors between start and end hex.
10
10
 
11
11
  Args:
12
12
  text (str): The text to apply the gradient to.
13
- start_hex (str): Starting color in hex format (e.g. 'c24a17').
14
- end_hex (str): Ending color in hex format (e.g. 'c77e36').
13
+ start_hex (str): Starting color in hex format (e.g. '#c24a17').
14
+ end_hex (str): Ending color in hex format (e.g. '#c77e36').
15
15
  text_length (int | None): Optional length override for the text. If provided, uses this instead of len(text).
16
16
 
17
17
  Returns:
@@ -1,12 +1,12 @@
1
1
  from stouputils.typing import JsonDict as JsonDict
2
2
 
3
- def create_gradient_text(text: str, start_hex: str = 'c24a17', end_hex: str = 'c77e36', text_length: int | None = None) -> list[JsonDict]:
3
+ def create_gradient_text(text: str, start_hex: str = '#c24a17', end_hex: str = '#c77e36', text_length: int | None = None) -> list[JsonDict]:
4
4
  """ Create a gradient text effect by interpolating colors between start and end hex.
5
5
 
6
6
  \tArgs:
7
7
  \t\ttext (str): The text to apply the gradient to.
8
- \t\tstart_hex (str): Starting color in hex format (e.g. 'c24a17').
9
- \t\tend_hex (str): Ending color in hex format (e.g. 'c77e36').
8
+ \t\tstart_hex (str): Starting color in hex format (e.g. '#c24a17').
9
+ \t\tend_hex (str): Ending color in hex format (e.g. '#c77e36').
10
10
  \t\ttext_length (int | None): Optional length override for the text. If provided, uses this instead of len(text).
11
11
 
12
12
  \tReturns:
@@ -1,7 +1,5 @@
1
1
 
2
2
  # Imports
3
- from __future__ import annotations
4
-
5
3
  import stouputils as stp
6
4
  from beet.core.utils import TextComponent
7
5
  from stouputils.typing import JsonDict
@@ -47,7 +45,6 @@ def text_component_to_str(tc: TextComponent) -> str:
47
45
  result += text_component_to_str(extra)
48
46
  return result
49
47
 
50
- @stp.simple_cache
51
48
  def item_id_to_text_component(item_id: str, use_default: bool = True) -> TextComponent:
52
49
  """ Get the TextComponent from an item id
53
50
 
@@ -99,7 +96,6 @@ def item_id_to_text_component(item_id: str, use_default: bool = True) -> TextCom
99
96
  return id.replace("_", " ").title()
100
97
  return ""
101
98
 
102
- @stp.simple_cache
103
99
  def item_id_to_name(item_id: str) -> str:
104
100
  """ Get the name from an item id
105
101
 
@@ -209,22 +209,16 @@ def get_lib_paths(ctx: Context) -> list[DownloadedLib]:
209
209
  ctx.cache["stewbeet"].timeout(days=30)
210
210
  mc_t = mc_tuple(ctx)
211
211
  mc_v = mc_str(ctx)
212
- results: list[DownloadedLib] = []
213
212
 
213
+ # Collect every lib to resolve first, then fetch them in parallel (network bound);
214
+ # results keep the input order because weld merges packs in this order.
215
+ tasks: list[tuple[str, JsonDict, str]] = []
214
216
  for lib_ns, lib_data in OFFICIAL_LIBS.items():
215
217
  if not lib_data.get("is_used", False):
216
218
  continue
217
219
  source = lib_data.get("source", "")
218
- if source == "smithed":
219
- r = resolve_smithed_lib(ctx, lib_ns, lib_data, mc_t)
220
- elif source == "modrinth":
221
- r = resolve_modrinth_lib(ctx, lib_ns, lib_data, mc_v)
222
- elif source == "static":
223
- r = resolve_static_lib(ctx, lib_ns, lib_data, mc_t, mc_v)
224
- else:
225
- continue
226
- if r:
227
- results.append(r)
220
+ if source in ("smithed", "modrinth", "static"):
221
+ tasks.append((lib_ns, lib_data, source))
228
222
 
229
223
  # Also process custom load_dependencies entries that specify a source
230
224
  load_deps: JsonDict = ctx.meta.get("stewbeet", {}).get("load_dependencies", {})
@@ -232,17 +226,21 @@ def get_lib_paths(ctx: Context) -> list[DownloadedLib]:
232
226
  source = lib_data.get("source", "")
233
227
  if not source:
234
228
  continue # old-format entry with explicit version — nothing to download
235
- if source == "smithed":
236
- r = resolve_smithed_lib(ctx, lib_ns, lib_data, mc_t)
237
- elif source == "modrinth":
238
- r = resolve_modrinth_lib(ctx, lib_ns, lib_data, mc_v)
239
- elif source == "static":
240
- r = resolve_static_lib(ctx, lib_ns, lib_data, mc_t, mc_v)
229
+ if source in ("smithed", "modrinth", "static"):
230
+ tasks.append((lib_ns, lib_data, source))
241
231
  else:
242
232
  stp.warning(f"Unknown source '{source}' for load_dependency '{lib_ns}'. Skipping download.")
243
- continue
244
- if r:
245
- results.append(r)
233
+
234
+ def resolve(task: tuple[str, JsonDict, str]) -> DownloadedLib | None:
235
+ lib_ns, lib_data, source = task
236
+ if source == "smithed":
237
+ return resolve_smithed_lib(ctx, lib_ns, lib_data, mc_t)
238
+ if source == "modrinth":
239
+ return resolve_modrinth_lib(ctx, lib_ns, lib_data, mc_v)
240
+ return resolve_static_lib(ctx, lib_ns, lib_data, mc_t, mc_v)
241
+
242
+ resolved: list[DownloadedLib | None] = stp.multithreading(resolve, tasks, max_workers=min(8, len(tasks))) if tasks else []
243
+ results: list[DownloadedLib] = [r for r in resolved if r]
246
244
 
247
245
  BUILD_CACHE[cache_key] = results
248
246
  return results