stewbeet 2.1.1__tar.gz → 2.1.3__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 (225) hide show
  1. {stewbeet-2.1.1 → stewbeet-2.1.3}/PKG-INFO +6 -6
  2. {stewbeet-2.1.1 → stewbeet-2.1.3}/pyproject.toml +6 -6
  3. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/smart_ore_generation.py +210 -206
  4. stewbeet-2.1.3/stewbeet/plugins/auto/headers/__init__.py +43 -0
  5. stewbeet-2.1.3/stewbeet/plugins/auto/headers/context_analyzer.py +99 -0
  6. stewbeet-2.1.3/stewbeet/plugins/auto/headers/execution_parser.py +212 -0
  7. stewbeet-2.1.3/stewbeet/plugins/auto/headers/function_analyzer.py +92 -0
  8. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/auto/headers/object.py +21 -2
  9. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/__init__.py +31 -0
  10. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/constants.py +63 -0
  11. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/extend_datapack.py +19 -0
  12. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/match.py +33 -0
  13. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/mod.mcdoc +30 -0
  14. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/quick_sort.py +102 -0
  15. stewbeet-2.1.3/stewbeet/plugins/datapack/sorters/selection_sort.py +124 -0
  16. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/initialize/__init__.py +3 -0
  17. stewbeet-2.1.1/stewbeet/plugins/auto/headers/__init__.py +0 -82
  18. {stewbeet-2.1.1 → stewbeet-2.1.3}/.gitignore +0 -0
  19. {stewbeet-2.1.1 → stewbeet-2.1.3}/LICENSE +0 -0
  20. {stewbeet-2.1.1 → stewbeet-2.1.3}/README.md +0 -0
  21. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/__init__.py +0 -0
  22. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/__main__.py +0 -0
  23. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/all.py +0 -0
  24. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/cli.py +0 -0
  25. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/__init__.py +0 -0
  26. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  27. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/github.py +0 -0
  28. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/modrinth.py +0 -0
  29. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/pmc.py +0 -0
  30. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/continuous_delivery/smithed.py +0 -0
  31. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  32. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  33. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  34. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/cables.py +0 -0
  35. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  36. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  37. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  38. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  39. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  40. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  41. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  42. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  43. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  44. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  45. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  46. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  47. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  48. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  49. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  50. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  51. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  52. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  53. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  54. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  55. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  56. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  57. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  58. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  59. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  60. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  61. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  62. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  63. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  64. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  65. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  66. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  67. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  68. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  69. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  70. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  71. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  72. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  73. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  74. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  75. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  76. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  77. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  78. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  79. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  80. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  81. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  82. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  83. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  84. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  85. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  86. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  87. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  88. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  89. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  90. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  91. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  92. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  93. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  94. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  95. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  96. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  97. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  98. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  99. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  100. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/gui.py +0 -0
  101. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  102. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  103. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  104. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/__init__.py +0 -0
  105. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/__memory__.py +0 -0
  106. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/constants.py +0 -0
  107. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/__init__.py +0 -0
  108. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/completion.py +0 -0
  109. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/equipments.py +0 -0
  110. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/materials.py +0 -0
  111. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/records.py +0 -0
  112. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
  113. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/definitions_helper/text.py +0 -0
  114. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/ingredients.py +0 -0
  115. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/utils/io.py +0 -0
  116. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/core/utils/sounds.py +0 -0
  117. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/__init__.py +0 -0
  118. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/bookshelf.py +0 -0
  119. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/bookshelf_config.json +0 -0
  120. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  121. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  122. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  123. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  124. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  125. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  126. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  127. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  128. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  129. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  130. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  131. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  132. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  133. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  134. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  135. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  136. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  137. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  138. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  139. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  140. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  141. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  142. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  143. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  144. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  145. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  146. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  147. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  148. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  149. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  150. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  151. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  152. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  153. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/archive/__init__.py +0 -0
  154. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  155. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  156. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  157. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  158. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  159. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  160. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  161. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  162. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  163. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  164. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  165. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  166. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  167. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  168. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  169. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  170. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  171. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  172. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  173. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  174. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  175. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  176. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  177. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  178. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  179. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  180. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  181. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  182. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  183. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  184. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  185. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  186. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  187. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  188. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  189. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
  190. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  191. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
  192. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
  193. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
  194. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/main.py +0 -0
  195. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/other_utils.py +0 -0
  196. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
  197. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/shared_import.py +0 -0
  198. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
  199. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  200. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  201. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  202. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  203. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  204. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  205. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  206. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  207. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  208. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  209. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  210. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  211. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  212. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  213. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  214. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  215. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  216. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  217. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  218. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  219. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  220. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  221. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  222. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  223. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  224. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
  225. {stewbeet-2.1.1 → stewbeet-2.1.3}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.1.1
3
+ Version: 2.1.3
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
@@ -11,14 +11,14 @@ Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Requires-Python: >=3.12
14
- Requires-Dist: beet>=0.110.1
15
- Requires-Dist: bolt>=0.49.1
16
- Requires-Dist: mecha>=0.98.1
17
- Requires-Dist: model-resolver>=1.8.0
14
+ Requires-Dist: beet>=0.111.0
15
+ Requires-Dist: bolt>=0.49.2
16
+ Requires-Dist: mecha>=0.99.0
17
+ Requires-Dist: model-resolver>=1.10.0
18
18
  Requires-Dist: mutagen>=1.47.0
19
19
  Requires-Dist: pyperclip>=1.8.0
20
20
  Requires-Dist: smithed>=0.19.0
21
- Requires-Dist: stouputils>=1.3.19
21
+ Requires-Dist: stouputils>=1.3.20
22
22
  Description-Content-Type: text/markdown
23
23
 
24
24
 
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stewbeet"
8
- version = "2.1.1"
8
+ version = "2.1.3"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -16,11 +16,11 @@ classifiers = [
16
16
  "Operating System :: OS Independent",
17
17
  ]
18
18
  dependencies = [
19
- "stouputils>=1.3.19",
20
- "model_resolver>=1.8.0",
21
- "beet>=0.110.1",
22
- "bolt>=0.49.1",
23
- "mecha>=0.98.1",
19
+ "stouputils>=1.3.20",
20
+ "model_resolver>=1.10.0",
21
+ "beet>=0.111.0",
22
+ "bolt>=0.49.2",
23
+ "mecha>=0.99.0",
24
24
  "smithed>=0.19.0",
25
25
  "mutagen>=1.47.0",
26
26
  "pyperclip>=1.8.0",
@@ -1,206 +1,210 @@
1
-
2
- # Imports
3
- from __future__ import annotations
4
-
5
- from stouputils.print import debug, error
6
-
7
- from ..__memory__ import Mem
8
- from ..constants import official_lib_used
9
- from ..utils.io import write_function
10
-
11
-
12
- class CustomOreGeneration:
13
- def __init__(
14
- self,
15
- dimensions: list[str],
16
- maximum_height: int = 70,
17
- minimum_height: int | None = None,
18
- veins_per_region: int = 4,
19
- vein_size_logic: float = 0.4,
20
- provider: str | list[str] = "#minecraft:overworld_carver_replaceables",
21
- placer_command: str = ""
22
- ) -> None:
23
- """ Creates a custom ore generation configuration.
24
-
25
- Args:
26
- dimensions (list[str]): The dimensions to generate the ore in (ex: ["minecraft:overworld"])
27
- maximum_height (int): The maximum height the ore can generate at
28
- minimum_height (int|None): The minimum height the ore can generate at (default: None for bedrock to maximum_height)
29
- veins_per_region (int): The number of veins per region
30
- vein_size_logic (float): The logic to calculate the vein size, higher = more ores
31
- provider (str|list[str]): The block or block tag to check for the ore to generate (default is same as vanilla ores in overworld), can be either a string or a list of strings
32
- placer_command (str): The placer command to use for the ore generation, usually a function to place the custom ore but can be anything, default is autogenerated
33
- """
34
- self.dimensions: list[str] = dimensions
35
- self.maximum_height: int = maximum_height
36
- self.minimum_height: int|None = minimum_height
37
- self.veins_per_region: int = veins_per_region
38
- self.vein_size_logic: float = vein_size_logic
39
- self.provider: str|list[str] = provider
40
- self.placer_command: str = placer_command
41
- if not official_lib_used("smart_ore_generation"):
42
- debug("Found custom ore generation, adding 'smart_ore_generation' dependency")
43
- self.check_validity()
44
-
45
- def check_validity(self) -> None:
46
- """ Check if the custom ore generation configuration is valid """
47
- if not isinstance(self.dimensions, list) or not all(isinstance(dimension, str) for dimension in self.dimensions):
48
- error("Custom ore generation 'dimensions' must be a list of strings")
49
- if not isinstance(self.maximum_height, int):
50
- error("Custom ore generation 'maximum_height' must be an integer")
51
- if self.minimum_height is not None and not isinstance(self.minimum_height, int):
52
- error("Custom ore generation 'minimum_height' must be an integer or None")
53
- elif self.minimum_height is not None and self.minimum_height > self.maximum_height:
54
- error("Custom ore generation 'minimum_height' must be less or equal to 'maximum_height'")
55
- if not isinstance(self.veins_per_region, int):
56
- error("Custom ore generation 'veins_per_region' must be an integer")
57
- if not isinstance(self.vein_size_logic, float) or self.vein_size_logic < 0:
58
- error("Custom ore generation 'vein_size_logic' must be a float >= 0")
59
- if not isinstance(self.provider, str) and not isinstance(self.provider, list):
60
- error("Custom ore generation 'provider' must be a string or a list of strings")
61
- if isinstance(self.provider, list) and not all(isinstance(provider, str) for provider in self.provider):
62
- error("Custom ore generation 'provider' must be a list of strings")
63
- if not isinstance(self.placer_command, str):
64
- error("Custom ore generation 'placer_command' must be a string")
65
-
66
- def generate_files(self, custom_ore: str, number: int | None = None) -> None:
67
- """ Generate the files for the custom ore generation.
68
-
69
- Args:
70
- custom_ore (str): The custom ore to generate, ex: "adamantium_ore"
71
- number (int|None): (optional) The number of the custom ore to generate, ex: 1 for "adamantium_ore_1", used when having multiple configurations for the same ore
72
- """
73
- # Setup basic variables
74
- beautify_ore: str = custom_ore.replace("_", " ").title()
75
- vein_name: str = custom_ore + ('' if number is None else f"_{number}")
76
- vein_path: str = f"{Mem.ctx.project_id}:calls/smart_ore_generation/veins/{vein_name}"
77
-
78
- # Setup placer command
79
- self._setup_placer_command(custom_ore)
80
-
81
- # Generate main ore generation function
82
- self._generate_main_function(beautify_ore, vein_path)
83
-
84
- # Generate vein function
85
- self._generate_vein_function(beautify_ore, vein_path)
86
-
87
- def _setup_placer_command(self, custom_ore: str) -> None:
88
- """ Setup the placer command for the ore generation.
89
-
90
- Args:
91
- custom_ore (str): The custom ore to generate
92
- """
93
- if not self.placer_command:
94
- self.placer_command = f"run function {Mem.ctx.project_id}:custom_blocks/{custom_ore}/place_main"
95
-
96
- # Handle deepslate variants
97
- if custom_ore.startswith("deepslate_") and custom_ore.replace("deepslate_", "") in Mem.definitions:
98
- self.placer_command = "unless block ~ ~ ~ minecraft:stone " + self.placer_command
99
- elif f"deepslate_{custom_ore}" in Mem.definitions:
100
- self.placer_command = "unless block ~ ~ ~ minecraft:deepslate " + self.placer_command
101
-
102
- def _generate_main_function(self, beautify_ore: str, vein_path: str) -> None:
103
- """ Generate the main ore generation function.
104
-
105
- Args:
106
- beautify_ore (str): The beautified ore name
107
- vein_path (str): The path to the vein function
108
- """
109
- # Generate dimensions check
110
- dimensions_check: str = ""
111
- for index, dimension in enumerate(self.dimensions):
112
- dimensions_check += f"\nexecute if dimension {dimension} run scoreboard players set #dimension smart_ore_generation.data {index}"
113
-
114
- # Generate minimum height operation
115
- op_mini: str = (
116
- "scoreboard players operation #min_height smart_ore_generation.data = _OVERWORLD_BOTTOM smart_ore_generation.data"
117
- if self.minimum_height is None
118
- else f"scoreboard players set #min_height smart_ore_generation.data {self.minimum_height}"
119
- )
120
-
121
- # Generate content
122
- content: str = f"""
123
- # Generate {beautify_ore} (x{self.veins_per_region})
124
- scoreboard players set #dimension smart_ore_generation.data -1{dimensions_check}
125
- {op_mini}
126
- scoreboard players set #max_height smart_ore_generation.data {self.maximum_height}
127
- """
128
- place_vein: str = f"execute if score #dimension smart_ore_generation.data matches 0.. run function {vein_path}\n"
129
- content += self.veins_per_region * place_vein
130
-
131
- # Write file
132
- write_function(f"{Mem.ctx.project_id}:calls/smart_ore_generation/generate_ores", content)
133
-
134
- def _generate_vein_function(self, beautify_ore: str, vein_path: str) -> None:
135
- """ Generate the vein function for ore generation.
136
-
137
- Args:
138
- beautify_ore (str): The beautified ore name
139
- vein_path (str): The path to the vein function
140
- """
141
- # Generate base content
142
- content: str = f"""
143
- # Try to find a random position adjacent to air in the region to generate the ore
144
- function #smart_ore_generation:v1/slots/random_position
145
-
146
- # Placing {beautify_ore} patch
147
- execute at @s if block ~ ~ ~ {self.provider} {self.placer_command}
148
- """
149
-
150
- # Add vein size logic if needed
151
- if self.vein_size_logic > 0:
152
- radius: float = self.vein_size_logic % 1
153
- while radius <= self.vein_size_logic:
154
- # Make a sphere of radius
155
- for x in range(-1, 2):
156
- for y in range(-1, 2):
157
- for z in range(-1, 2):
158
- content += f"execute at @s positioned ~{x*radius} ~{y*radius} ~{z*radius} if block ~ ~ ~ {self.provider} {self.placer_command}\n"
159
- radius += 1
160
-
161
- # Write file
162
- write_function(vein_path, content)
163
-
164
- @staticmethod
165
- def all_with_config(ore_configs: dict[str, list[CustomOreGeneration]]) -> None:
166
- """ Generate all custom ore generation files with the configurations provided
167
-
168
- Args:
169
- ore_configs (dict[str, list[CustomOreGeneration]]): The custom ore generation configurations, ex:
170
-
171
- ```py
172
- {
173
- "super_iron_ore": [
174
- CustomOreGeneration(
175
- dimensions = ["minecraft:overworld","stardust:cavern","some_other:dimension"],
176
- maximum_height = 50,
177
- minimum_height = 0,
178
- veins_per_region = 2,
179
- vein_size_logic = 0.4,
180
- )
181
- ],
182
- "deepslate_super_iron_ore": [
183
- CustomOreGeneration(
184
- dimensions = ["minecraft:overworld"],
185
- maximum_height = 0,
186
- veins_per_region = 2,
187
- vein_size_logic = 0.4,
188
- ),
189
- CustomOreGeneration(
190
- dimensions = ["stardust:cavern"],
191
- maximum_height = 0,
192
- veins_per_region = 8,
193
- vein_size_logic = 0.8,
194
- )
195
- ], ...
196
- }
197
- ```
198
- """
199
- for ore, config_list in ore_configs.items():
200
- for i, gen_config in enumerate(config_list):
201
- if len(config_list) > 1:
202
- gen_config.generate_files(ore, i)
203
- else:
204
- gen_config.generate_files(ore)
205
- return
206
-
1
+
2
+ # Imports
3
+ from __future__ import annotations
4
+
5
+ from stouputils.print import debug, error
6
+
7
+ from ..__memory__ import Mem
8
+ from ..constants import official_lib_used
9
+ from ..utils.io import write_function
10
+
11
+
12
+ class CustomOreGeneration:
13
+ def __init__(
14
+ self,
15
+ dimensions: list[str],
16
+ maximum_height: int = 70,
17
+ minimum_height: int | None = None,
18
+ veins_per_region: float = 4,
19
+ vein_size_logic: float = 0.4,
20
+ provider: str | list[str] = "#minecraft:overworld_carver_replaceables",
21
+ placer_command: str = ""
22
+ ) -> None:
23
+ """ Creates a custom ore generation configuration.
24
+
25
+ Args:
26
+ dimensions (list[str]): The dimensions to generate the ore in (ex: ["minecraft:overworld"])
27
+ maximum_height (int): The maximum height the ore can generate at
28
+ minimum_height (int|None): The minimum height the ore can generate at (default: None for bedrock to maximum_height)
29
+ veins_per_region (float): The number of veins per region
30
+ vein_size_logic (float): The logic to calculate the vein size, higher = more ores
31
+ provider (str|list[str]): The block or block tag to check for the ore to generate (default is same as vanilla ores in overworld), can be either a string or a list of strings
32
+ placer_command (str): The placer command to use for the ore generation, usually a function to place the custom ore but can be anything, default is autogenerated
33
+ """
34
+ self.dimensions: list[str] = dimensions
35
+ self.maximum_height: int = maximum_height
36
+ self.minimum_height: int|None = minimum_height
37
+ self.veins_per_region: float = veins_per_region
38
+ self.vein_size_logic: float = vein_size_logic
39
+ self.provider: str|list[str] = provider
40
+ self.placer_command: str = placer_command
41
+ if not official_lib_used("smart_ore_generation"):
42
+ debug("Found custom ore generation, adding 'smart_ore_generation' dependency")
43
+ self.check_validity()
44
+
45
+ def check_validity(self) -> None:
46
+ """ Check if the custom ore generation configuration is valid """
47
+ if not isinstance(self.dimensions, list) or not all(isinstance(dimension, str) for dimension in self.dimensions):
48
+ error("Custom ore generation 'dimensions' must be a list of strings")
49
+ if not isinstance(self.maximum_height, int):
50
+ error("Custom ore generation 'maximum_height' must be an integer")
51
+ if self.minimum_height is not None and not isinstance(self.minimum_height, int):
52
+ error("Custom ore generation 'minimum_height' must be an integer or None")
53
+ elif self.minimum_height is not None and self.minimum_height > self.maximum_height:
54
+ error("Custom ore generation 'minimum_height' must be less or equal to 'maximum_height'")
55
+ if not isinstance(self.veins_per_region, float | int):
56
+ error("Custom ore generation 'veins_per_region' must be a float")
57
+ if not isinstance(self.vein_size_logic, float) or self.vein_size_logic < 0:
58
+ error("Custom ore generation 'vein_size_logic' must be a float >= 0")
59
+ if not isinstance(self.provider, str) and not isinstance(self.provider, list):
60
+ error("Custom ore generation 'provider' must be a string or a list of strings")
61
+ if isinstance(self.provider, list) and not all(isinstance(provider, str) for provider in self.provider):
62
+ error("Custom ore generation 'provider' must be a list of strings")
63
+ if not isinstance(self.placer_command, str):
64
+ error("Custom ore generation 'placer_command' must be a string")
65
+
66
+ def generate_files(self, custom_ore: str, number: int | None = None) -> None:
67
+ """ Generate the files for the custom ore generation.
68
+
69
+ Args:
70
+ custom_ore (str): The custom ore to generate, ex: "adamantium_ore"
71
+ number (int|None): (optional) The number of the custom ore to generate, ex: 1 for "adamantium_ore_1", used when having multiple configurations for the same ore
72
+ """
73
+ # Setup basic variables
74
+ beautify_ore: str = custom_ore.replace("_", " ").title()
75
+ vein_name: str = custom_ore + ('' if number is None else f"_{number}")
76
+ vein_path: str = f"{Mem.ctx.project_id}:calls/smart_ore_generation/veins/{vein_name}"
77
+
78
+ # Setup placer command
79
+ self._setup_placer_command(custom_ore)
80
+
81
+ # Generate main ore generation function
82
+ self._generate_main_function(beautify_ore, vein_path)
83
+
84
+ # Generate vein function
85
+ self._generate_vein_function(beautify_ore, vein_path)
86
+
87
+ def _setup_placer_command(self, custom_ore: str) -> None:
88
+ """ Setup the placer command for the ore generation.
89
+
90
+ Args:
91
+ custom_ore (str): The custom ore to generate
92
+ """
93
+ if not self.placer_command:
94
+ self.placer_command = f"run function {Mem.ctx.project_id}:custom_blocks/{custom_ore}/place_main"
95
+
96
+ # Handle deepslate variants
97
+ if custom_ore.startswith("deepslate_") and custom_ore.replace("deepslate_", "") in Mem.definitions:
98
+ self.placer_command = "unless block ~ ~ ~ minecraft:stone " + self.placer_command
99
+ elif f"deepslate_{custom_ore}" in Mem.definitions:
100
+ self.placer_command = "unless block ~ ~ ~ minecraft:deepslate " + self.placer_command
101
+
102
+ def _generate_main_function(self, beautify_ore: str, vein_path: str) -> None:
103
+ """ Generate the main ore generation function.
104
+
105
+ Args:
106
+ beautify_ore (str): The beautified ore name
107
+ vein_path (str): The path to the vein function
108
+ """
109
+ # Generate dimensions check
110
+ dimensions_check: str = ""
111
+ for index, dimension in enumerate(self.dimensions):
112
+ dimensions_check += f"\nexecute if dimension {dimension} run scoreboard players set #dimension smart_ore_generation.data {index}"
113
+
114
+ # Generate minimum height operation
115
+ op_mini: str = (
116
+ "scoreboard players operation #min_height smart_ore_generation.data = _OVERWORLD_BOTTOM smart_ore_generation.data"
117
+ if self.minimum_height is None
118
+ else f"scoreboard players set #min_height smart_ore_generation.data {self.minimum_height}"
119
+ )
120
+
121
+ # Generate content (if 3.5, we add 3 lines and another with 0.5 chance)
122
+ int_veins_per_region: int = int(self.veins_per_region)
123
+ remaining_veins: float = self.veins_per_region - int_veins_per_region
124
+ content: str = f"""
125
+ # Generate {beautify_ore} (x{self.veins_per_region})
126
+ scoreboard players set #dimension smart_ore_generation.data -1{dimensions_check}
127
+ {op_mini}
128
+ scoreboard players set #max_height smart_ore_generation.data {self.maximum_height}
129
+ """
130
+ place_vein: str = f"execute if score #dimension smart_ore_generation.data matches 0.. run function {vein_path}\n"
131
+ content += int_veins_per_region * place_vein
132
+ if remaining_veins > 0:
133
+ content += f"execute if score #dimension smart_ore_generation.data matches 0.. if predicate {{condition:\"minecraft:random_chance\",chance:{remaining_veins:.5f}}} run function {vein_path}\n"
134
+
135
+ # Write file
136
+ write_function(f"{Mem.ctx.project_id}:calls/smart_ore_generation/generate_ores", content)
137
+
138
+ def _generate_vein_function(self, beautify_ore: str, vein_path: str) -> None:
139
+ """ Generate the vein function for ore generation.
140
+
141
+ Args:
142
+ beautify_ore (str): The beautified ore name
143
+ vein_path (str): The path to the vein function
144
+ """
145
+ # Generate base content
146
+ content: str = f"""
147
+ # Try to find a random position adjacent to air in the region to generate the ore
148
+ function #smart_ore_generation:v1/slots/random_position
149
+
150
+ # Placing {beautify_ore} patch
151
+ execute at @s if block ~ ~ ~ {self.provider} {self.placer_command}
152
+ """
153
+
154
+ # Add vein size logic if needed
155
+ if self.vein_size_logic > 0:
156
+ radius: float = self.vein_size_logic % 1
157
+ while radius <= self.vein_size_logic:
158
+ # Make a sphere of radius
159
+ for x in range(-1, 2):
160
+ for y in range(-1, 2):
161
+ for z in range(-1, 2):
162
+ content += f"execute at @s positioned ~{x*radius} ~{y*radius} ~{z*radius} if block ~ ~ ~ {self.provider} {self.placer_command}\n"
163
+ radius += 1
164
+
165
+ # Write file
166
+ write_function(vein_path, content)
167
+
168
+ @staticmethod
169
+ def all_with_config(ore_configs: dict[str, list[CustomOreGeneration]]) -> None:
170
+ """ Generate all custom ore generation files with the configurations provided
171
+
172
+ Args:
173
+ ore_configs (dict[str, list[CustomOreGeneration]]): The custom ore generation configurations, ex:
174
+
175
+ ```py
176
+ {
177
+ "super_iron_ore": [
178
+ CustomOreGeneration(
179
+ dimensions = ["minecraft:overworld","stardust:cavern","some_other:dimension"],
180
+ maximum_height = 50,
181
+ minimum_height = 0,
182
+ veins_per_region = 2,
183
+ vein_size_logic = 0.4,
184
+ )
185
+ ],
186
+ "deepslate_super_iron_ore": [
187
+ CustomOreGeneration(
188
+ dimensions = ["minecraft:overworld"],
189
+ maximum_height = 0,
190
+ veins_per_region = 2,
191
+ vein_size_logic = 0.4,
192
+ ),
193
+ CustomOreGeneration(
194
+ dimensions = ["stardust:cavern"],
195
+ maximum_height = 0,
196
+ veins_per_region = 8,
197
+ vein_size_logic = 0.8,
198
+ )
199
+ ], ...
200
+ }
201
+ ```
202
+ """
203
+ for ore, config_list in ore_configs.items():
204
+ for i, gen_config in enumerate(config_list):
205
+ if len(config_list) > 1:
206
+ gen_config.generate_files(ore, i)
207
+ else:
208
+ gen_config.generate_files(ore)
209
+ return
210
+
@@ -0,0 +1,43 @@
1
+
2
+ # Imports
3
+ from beet import Context
4
+ from stouputils.decorators import measure_time
5
+ from stouputils.print import progress
6
+
7
+ from ....core.__memory__ import Mem
8
+ from ....core.utils.io import read_function, write_function
9
+ from .object import Header
10
+ from .function_analyzer import FunctionAnalyzer
11
+ from .context_analyzer import ContextAnalyzer
12
+
13
+
14
+ # Main entry point
15
+ @measure_time(progress, message="Execution time of 'stewbeet.plugins.auto.headers'")
16
+ def beet_default(ctx: Context):
17
+ """ Main entry point for the headers plugin.
18
+
19
+ Args:
20
+ ctx (Context): The beet context.
21
+ """
22
+ if Mem.ctx is None:
23
+ Mem.ctx = ctx
24
+
25
+ # Get all mcfunctions paths and create Header objects
26
+ mcfunctions: dict[str, Header] = {}
27
+ for path in ctx.data.functions:
28
+ # Create a Header object from the function content
29
+ content: str = read_function(path)
30
+ mcfunctions[path] = Header.from_content(path, content)
31
+
32
+ # Analyze function relationships
33
+ function_analyzer = FunctionAnalyzer(ctx, mcfunctions)
34
+ function_analyzer.analyze_all_relationships()
35
+
36
+ # Analyze execution contexts
37
+ context_analyzer = ContextAnalyzer(mcfunctions)
38
+ context_analyzer.analyze_all_contexts()
39
+
40
+ # Write updated headers to all mcfunction files
41
+ for path, header in mcfunctions.items():
42
+ write_function(path, header.to_str(), overwrite=True)
43
+
@@ -0,0 +1,99 @@
1
+ """
2
+ Context analysis utilities for determining execution contexts of Minecraft functions.
3
+
4
+ This module handles analyzing function call relationships and determining
5
+ the execution context based on caller information.
6
+ """
7
+
8
+ # Imports
9
+ from .object import Header
10
+
11
+
12
+ # Class
13
+ class ContextAnalyzer:
14
+ """ Analyzes and determines execution contexts for Minecraft functions. """
15
+
16
+ def __init__(self, mcfunctions: dict[str, Header]):
17
+ """ Initialize the context analyzer.
18
+
19
+ Args:
20
+ mcfunctions (dict[str, Header]): dictionary mapping function paths to Header objects
21
+ """
22
+ self.mcfunctions = mcfunctions
23
+ self.execution_contexts: dict[str, str | None] = {}
24
+
25
+ def determine_execution_context(self, func_path: str, visited: set[str] | None = None) -> str | None:
26
+ """ Determine the execution context of a function based on its callers.
27
+
28
+ Args:
29
+ func_path (str): The path of the function to analyze
30
+ visited (set[str] | None): Set of already visited functions to prevent infinite recursion
31
+
32
+ Returns:
33
+ str | None: The execution context, or None if unknown
34
+ """
35
+ if visited is None:
36
+ visited = set()
37
+
38
+ if func_path in visited:
39
+ return None
40
+
41
+ if func_path in self.execution_contexts:
42
+ return self.execution_contexts[func_path]
43
+
44
+ visited.add(func_path)
45
+
46
+ if func_path not in self.mcfunctions:
47
+ return None
48
+
49
+ within = self.mcfunctions[func_path].within
50
+
51
+ # If no callers, default context
52
+ if not within:
53
+ self.execution_contexts[func_path] = None
54
+ return self.execution_contexts[func_path]
55
+
56
+ # Check for specific contexts
57
+ for caller in within:
58
+ # Advancement functions are executed as the player at current position
59
+ if caller.startswith("advancement "):
60
+ self.execution_contexts[func_path] = "as the player & at current position"
61
+ return self.execution_contexts[func_path]
62
+
63
+ # Tick and load tags have default context
64
+ if caller in ["#minecraft:tick", "#minecraft:load"]:
65
+ self.execution_contexts[func_path] = None
66
+ return self.execution_contexts[func_path]
67
+
68
+ # Check if caller has execution context in brackets
69
+ if " [" in caller and "]" in caller:
70
+ # Extract the execution context (must have space before [ to distinguish from NBT paths)
71
+ context_start = caller.find(" [")
72
+ context_end = caller.rfind("]") # Find the LAST ] not the first
73
+ if context_start != -1 and context_end != -1:
74
+ context = caller[context_start + 2:context_end] # +2 to skip " ["
75
+ # Only consider it an execution context if it contains execution keywords
76
+ if any(keyword in context for keyword in ["as ", "at ", "positioned ", "rotated ", "facing ", "in ", "anchored ", "align "]):
77
+ self.execution_contexts[func_path] = context
78
+ return self.execution_contexts[func_path]
79
+
80
+ # If called by another function, inherit its context
81
+ # Extract the function name (remove macros and context info)
82
+ base_caller = caller.split(" ")[0] # Get just the function path
83
+ if base_caller in self.mcfunctions:
84
+ parent_context = self.determine_execution_context(base_caller, visited.copy())
85
+ self.execution_contexts[func_path] = parent_context
86
+ return self.execution_contexts[func_path]
87
+
88
+ # Default context
89
+ self.execution_contexts[func_path] = None
90
+ return self.execution_contexts[func_path]
91
+
92
+ def analyze_all_contexts(self) -> None:
93
+ """ Analyze and determine execution contexts for all functions. """
94
+ for path in self.mcfunctions:
95
+ context = self.determine_execution_context(path)
96
+ # Only set the context if it's not None
97
+ if context is not None:
98
+ self.mcfunctions[path].executed = context
99
+