stewbeet 2.2.2__tar.gz → 2.2.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 (241) hide show
  1. {stewbeet-2.2.2 → stewbeet-2.2.3}/PKG-INFO +1 -1
  2. {stewbeet-2.2.2 → stewbeet-2.2.3}/pyproject.toml +1 -1
  3. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/all.py +1 -0
  4. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/constants.py +2 -0
  5. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/completion.py +11 -6
  6. stewbeet-2.2.3/stewbeet/plugins/custom_paintings/__init__.py +83 -0
  7. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/iso_renders.py +15 -2
  8. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/initialize/__init__.py +4 -0
  9. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/verify_definitions/__init__.py +22 -0
  10. {stewbeet-2.2.2 → stewbeet-2.2.3}/.gitignore +0 -0
  11. {stewbeet-2.2.2 → stewbeet-2.2.3}/LICENSE +0 -0
  12. {stewbeet-2.2.2 → stewbeet-2.2.3}/README.md +0 -0
  13. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/__init__.py +0 -0
  14. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/__main__.py +0 -0
  15. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/cli.py +0 -0
  16. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/__init__.py +0 -0
  17. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  18. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/github.py +0 -0
  19. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/modrinth.py +0 -0
  20. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/pmc.py +0 -0
  21. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/continuous_delivery/smithed.py +0 -0
  22. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/__init__.py +0 -0
  23. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/balancing.py +0 -0
  24. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/batteries.py +0 -0
  25. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/cables.py +0 -0
  26. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
  27. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
  28. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
  29. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
  30. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
  31. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
  32. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
  33. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
  34. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
  35. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
  36. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
  37. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
  38. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
  39. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
  40. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
  41. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
  42. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
  43. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
  44. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
  45. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
  46. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
  47. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
  48. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
  49. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
  50. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
  51. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
  52. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
  53. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
  54. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
  55. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
  56. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
  57. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
  58. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
  59. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
  60. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
  61. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
  62. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
  63. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
  64. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
  65. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
  66. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
  67. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
  68. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
  69. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
  70. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
  71. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
  72. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
  73. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
  74. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
  75. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
  76. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
  77. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
  78. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
  79. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
  80. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
  81. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
  82. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
  83. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
  84. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
  85. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
  86. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
  87. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
  88. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
  89. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
  90. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
  91. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/gui.py +0 -0
  92. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
  93. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
  94. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/py.typed +0 -0
  95. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
  96. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
  97. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
  98. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
  99. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
  100. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
  101. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
  102. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
  103. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/contrib/simplenergy/wrench.py +0 -0
  104. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/__init__.py +0 -0
  105. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/__memory__.py +0 -0
  106. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/__init__.py +0 -0
  107. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/equipments.py +0 -0
  108. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/materials.py +0 -0
  109. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/records.py +0 -0
  110. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
  111. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  112. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/definitions_helper/text.py +0 -0
  113. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/ingredients.py +0 -0
  114. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/utils/io.py +0 -0
  115. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/core/utils/sounds.py +0 -0
  116. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/__init__.py +0 -0
  117. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/bookshelf.py +0 -0
  118. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/bookshelf_config.json +0 -0
  119. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  120. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  121. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  122. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  123. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  124. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  125. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  126. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  127. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  128. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  129. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  130. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  131. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  132. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  133. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  134. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  135. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  136. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  137. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  138. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  139. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  140. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  141. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  142. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  143. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  144. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  145. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  146. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  147. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  148. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  149. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  150. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  151. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  152. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/archive/__init__.py +0 -0
  153. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  154. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
  155. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
  156. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
  157. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/headers/object.py +0 -0
  158. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
  159. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  160. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  161. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  162. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  163. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  164. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  165. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  166. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  167. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  168. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
  169. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  170. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  171. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
  172. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
  173. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
  174. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
  175. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/match.py +0 -0
  176. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
  177. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
  178. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
  179. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  180. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  181. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  182. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  183. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
  184. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  185. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  186. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  187. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  188. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  189. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  190. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
  191. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  192. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  193. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  194. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  195. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  196. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  197. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
  198. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  199. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  200. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  201. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
  202. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  203. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
  204. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  205. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
  206. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
  207. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/main.py +0 -0
  208. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/other_utils.py +0 -0
  209. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
  210. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/shared_import.py +0 -0
  211. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
  212. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  213. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  214. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  215. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  216. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  217. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  218. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  219. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
  220. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  221. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  222. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  223. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  224. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  225. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  226. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
  227. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  228. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  229. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  230. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
  231. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  232. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  233. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  234. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  235. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  236. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  237. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  238. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
  239. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  240. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/py.typed +0 -0
  241. {stewbeet-2.2.2 → stewbeet-2.2.3}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.2.2
3
+ Version: 2.2.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
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stewbeet"
8
- version = "2.2.2"
8
+ version = "2.2.3"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -9,6 +9,7 @@ GENERATION_PLUGINS = (
9
9
  "stewbeet.plugins.resource_pack.item_models",
10
10
  "stewbeet.plugins.resource_pack.check_power_of_2",
11
11
  "stewbeet.plugins.custom_recipes",
12
+ "stewbeet.plugins.custom_paintings",
12
13
  "stewbeet.plugins.ingame_manual",
13
14
  "stewbeet.plugins.datapack.loading",
14
15
  "stewbeet.plugins.datapack.custom_blocks",
@@ -64,6 +64,7 @@ VANILLA_BLOCK_FOR_ORES: JsonDict = {"id":"minecraft:polished_deepslate", "apply_
64
64
  OVERRIDE_MODEL: str = "override_model" # Key to a dictionnary that will be used to override the whole model
65
65
  PULVERIZING: str = "simplenergy_pulverizing" # Value of a recipe type, used to generate dusts from ores (used by SimplEnergy)
66
66
  SMITHED_CRAFTER_COMMAND: str = "smithed_crafter_command" # Key to a command that will be used in a recipe in the Smithed Crafter library. If not present, the command will be defaulted to a loot table. Ex: {"result":...,SMITHED_CRAFTER_COMMAND: "function your_namespace:calls/smithed_crafter/do_something_else"}
67
+ PAINTING_DATA: str = "painting_data" # Key to a dict that contains the painting data, like {"author":"","title":"","width":1,"height":1} where author and title defaults to beet config values if not given
67
68
  GROWING_SEED: str = "staged_seed" # Key to a seed that has multiple growth stages, value needs to be a dict like {"texture_basename":"wheat","stages":8,"seconds":600,"planted_on":"stone","loots":[{"id":"minecraft:wheat_seeds","min_count":1,"max_count":3}]} where loots can be either this format or a loot table path "namespace:blocks/loot_table_name"
68
69
  WIKI_COMPONENT: str = "wiki_components" # Key to a text component that will be used to generate the wiki button in the manual
69
70
  RESULT_OF_CRAFTING: str = "result_of_crafting" # Key to a list of recipes to craft the item, ex: "adamantium": {RESULT_OF_CRAFTING: [...]}
@@ -78,6 +79,7 @@ NOT_COMPONENTS: list[str] = [ # Keys that should not be considered as comp
78
79
  NO_SILK_TOUCH_DROP,
79
80
  OVERRIDE_MODEL,
80
81
  SMITHED_CRAFTER_COMMAND,
82
+ PAINTING_DATA,
81
83
  GROWING_SEED,
82
84
  ]
83
85
 
@@ -3,6 +3,8 @@
3
3
  # Imports
4
4
  from __future__ import annotations
5
5
 
6
+ from typing import cast
7
+
6
8
  from beet.core.utils import JsonDict, TextComponent
7
9
  from box import Box
8
10
 
@@ -10,17 +12,20 @@ from ..__memory__ import Mem
10
12
 
11
13
 
12
14
  # Add item model component
13
- def add_item_model_component(black_list: list[str] | None = None) -> None:
15
+ def add_item_model_component(black_list: list[str] | None = None, ignore_paintings: bool = True) -> None:
14
16
  """ Add an item model component to all items in the definitions.
15
17
 
16
18
  Args:
17
- black_list (list[str]): The list of items to ignore.
19
+ black_list (list[str]): The list of items to ignore.
20
+ ignore_paintings (bool): Whether to ignore items that are paintings (have PAINTING_DATA).
18
21
  """
19
22
  if black_list is None:
20
23
  black_list = []
21
24
  for item, data in Mem.definitions.items():
22
25
  if item in black_list or data.get("item_model", None) is not None:
23
26
  continue
27
+ if ignore_paintings and data.get("painting_data", None) is not None:
28
+ continue
24
29
  data["item_model"] = f"{Mem.ctx.project_id}:{item}"
25
30
  return
26
31
 
@@ -52,7 +57,7 @@ def add_item_name_and_lore_if_missing(is_external: bool = False, black_list: lis
52
57
 
53
58
  # Apply namespaced lore if none
54
59
  if not data.get("lore"):
55
- data["lore"] = []
60
+ data["lore"] = cast(list[TextComponent], [])
56
61
 
57
62
  # If item is not external,
58
63
  if not is_external:
@@ -83,7 +88,7 @@ def add_private_custom_data_for_namespace(is_external: bool = False) -> None:
83
88
  """
84
89
  for item, data in Mem.definitions.items():
85
90
  if not data.get("custom_data"):
86
- data["custom_data"] = {}
91
+ data["custom_data"] = cast(JsonDict, {})
87
92
  if is_external and ":" in item:
88
93
  ns, id = item.split(":")
89
94
  else:
@@ -101,6 +106,6 @@ def add_smithed_ignore_vanilla_behaviours_convention() -> None:
101
106
  """
102
107
  for data in Mem.definitions.values():
103
108
  data["custom_data"] = Box(data.get("custom_data", {}), default_box=True, default_box_attr={}, default_box_create_on_get=True)
104
- data["custom_data"].smithed.ignore.functionality = True
105
- data["custom_data"].smithed.ignore.crafting = True
109
+ data["custom_data"].smithed.ignore.functionality = True # pyright: ignore[reportUnknownMemberType]
110
+ data["custom_data"].smithed.ignore.crafting = True # pyright: ignore[reportUnknownMemberType]
106
111
 
@@ -0,0 +1,83 @@
1
+
2
+ # Imports
3
+ import os
4
+
5
+ from beet import Context, PaintingVariant, PaintingVariantTag, Texture
6
+ from beet.core.utils import JsonDict
7
+ from stouputils.decorators import measure_time
8
+ from stouputils.io import relative_path, super_json_load
9
+ from stouputils.print import error, progress, warning
10
+
11
+ from ...core.__memory__ import Mem
12
+ from ...core.constants import PAINTING_DATA
13
+ from ...core.utils.io import set_json_encoder
14
+
15
+
16
+ # Main entry point
17
+ @measure_time(progress, message="Execution time of 'stewbeet.plugins.custom_paintings'")
18
+ def beet_default(ctx: Context) -> None:
19
+ """ Main entry point for the custom paintings plugin.
20
+ This plugin handles the generation of custom paintings for the datapack and resource pack.
21
+
22
+ Requires a valid definitions in Mem.definitions in order to function properly using constant 'PAINTING_DATA'.
23
+
24
+ Args:
25
+ ctx (Context): The beet context.
26
+ """
27
+ if Mem.ctx is None: # pyright: ignore[reportUnnecessaryComparison]
28
+ Mem.ctx = ctx
29
+ ns: str = ctx.project_id
30
+ textures_folder: str = Mem.ctx.meta.get("stewbeet", {}).get("textures_folder", "")
31
+ placeable_values: list[str] = []
32
+
33
+ # Assertions
34
+ assert textures_folder, "The 'textures_folder' key is missing in the 'stewbeet' section of the beet.yml file."
35
+
36
+ # For each item definition that has painting data,
37
+ for item, data in Mem.definitions.items():
38
+ painting_data: JsonDict = data.get(PAINTING_DATA, {})
39
+ if painting_data:
40
+
41
+ ## Datapack
42
+ # Add the item id to the list of painting variants values
43
+ if not painting_data.get("not_placeable", False):
44
+ placeable_values.append(f"{ns}:{item}")
45
+
46
+ # Set default author and title if not provided
47
+ if "author" not in painting_data:
48
+ painting_data["author"] = {"text": Mem.ctx.project_author or "Unknown"}
49
+ if "title" not in painting_data:
50
+ painting_data["title"] = data.get("item_name") or {"text": item.replace("_", " ").title()}
51
+
52
+ # Create ordered painting data with asset_id first
53
+ ordered_painting_data = {"asset_id": f"{ns}:{item}"}
54
+ ordered_painting_data.update(painting_data)
55
+ ordered_painting_data.pop("not_placeable", None)
56
+
57
+ # Create the painting definition
58
+ Mem.ctx.data[ns].painting_variants[item] = set_json_encoder(PaintingVariant(ordered_painting_data))
59
+
60
+ ## Resource pack
61
+ # Get the texture path
62
+ matching_textures: list[str] = [
63
+ relative_path(f"{root}/{file}")
64
+ for root, _, files in os.walk(textures_folder)
65
+ for file in files if file == f"{item}.png"
66
+ ]
67
+ if not matching_textures:
68
+ error(f"No texture found for painting '{item}' in the textures folder '{textures_folder}'. Expected a file named '{item}.png'.")
69
+ continue
70
+ elif len(matching_textures) > 1:
71
+ warning(f"Multiple textures found for painting '{item}' in the textures folder '{textures_folder}'. Using the first one found: '{matching_textures[0]}'.")
72
+ src: str = matching_textures[0]
73
+ dst: str = f"painting/{item}"
74
+
75
+ # Check if the texture is not already registered
76
+ if not Mem.ctx.assets[ns].textures.get(dst):
77
+ mcmeta: JsonDict | None = None if not os.path.exists(src + ".mcmeta") else super_json_load(f"{src}.mcmeta")
78
+ Mem.ctx.assets[ns].textures[dst] = Texture(source_path=src, mcmeta=mcmeta)
79
+
80
+ # Add the painting variant tag to the context data
81
+ if placeable_values:
82
+ Mem.ctx.data["minecraft"].painting_variant_tags["placeable"] = set_json_encoder(PaintingVariantTag({"values": placeable_values}))
83
+
@@ -1,6 +1,7 @@
1
1
 
2
2
  # Imports
3
3
  import os
4
+ import shutil
4
5
  from typing import cast
5
6
 
6
7
  import requests
@@ -92,8 +93,9 @@ def generate_all_iso_renders():
92
93
  pass
93
94
 
94
95
  # Download all the vanilla textures from the wiki
95
- def download_item(item: str):
96
- destination = f"{path}/minecraft/{item}.png"
96
+ def download_item(item: str, destination: str = ""):
97
+ if not destination:
98
+ destination = f"{path}/minecraft/{item}.png"
97
99
  if not (os.path.exists(destination) and cache_assets): # If not downloaded yet or not using cache
98
100
  link: str = f"{DOWNLOAD_VANILLA_ASSETS_RAW}/item/{item}.png"
99
101
  response = requests.get(link)
@@ -113,3 +115,14 @@ def generate_all_iso_renders():
113
115
  # Multithread the download
114
116
  multithreading(download_item, used_vanilla_items, max_workers=min(32, len(used_vanilla_items)))
115
117
 
118
+ # Download painting texture for custom paintings
119
+ last_painting_path: str = ""
120
+ for item, data in Mem.definitions.items():
121
+ if data["id"] == "minecraft:painting" and not data.get("item_model"):
122
+ if not last_painting_path:
123
+ last_painting_path = f"{path}/{ns}/{item}.png"
124
+ download_item("painting", last_painting_path)
125
+ else:
126
+ # Just copy the last painting downloaded
127
+ shutil.copy(last_painting_path, f"{path}/{ns}/{item}.png")
128
+
@@ -56,6 +56,10 @@ def beet_default(ctx: Context):
56
56
  ctx.data.pack_format_registry.update(MORE_DATA_PACK_FORMATS)
57
57
  ctx.assets.pack_format_registry.update(MORE_ASSETS_PACK_FORMATS)
58
58
  ctx.meta["data_version"] = MORE_DATA_VERSIONS
59
+ if ctx.minecraft_version:
60
+ tuple_version: tuple[int, ...] = tuple(int(x) for x in ctx.minecraft_version.split(".") if x.isdigit())
61
+ ctx.data.pack_format = ctx.data.pack_format_registry.get(tuple_version, ctx.data.pack_format)
62
+ ctx.assets.pack_format = ctx.assets.pack_format_registry.get(tuple_version, ctx.assets.pack_format)
59
63
 
60
64
  # Helper function to setup pack.mcmeta
61
65
  def setup_pack_mcmeta(pack: Pack[Any], pack_format: int):
@@ -16,6 +16,7 @@ from ...core.constants import (
16
16
  CUSTOM_BLOCK_ALTERNATIVE,
17
17
  CUSTOM_BLOCK_VANILLA,
18
18
  NO_SILK_TOUCH_DROP,
19
+ PAINTING_DATA,
19
20
  RESULT_OF_CRAFTING,
20
21
  USED_FOR_CRAFTING,
21
22
  VANILLA_BLOCK,
@@ -241,6 +242,27 @@ def beet_default(ctx: Context) -> None:
241
242
  if (not recipe.get("result_count") or not isinstance(recipe["result_count"], int)) and (recipe.get("type") not in ("smithing_trim",)):
242
243
  errors.append(f"Recipe #{i} in RESULT_OF_CRAFTING should have an int 'result_count' key for '{item}'")
243
244
 
245
+ # Check the PAINTING_DATA key
246
+ if data.get(PAINTING_DATA):
247
+ if data["id"] != "minecraft:painting":
248
+ errors.append(f"PAINTING_DATA key should only be used with 'id' equal to 'minecraft:painting' for '{item}', found '{data['id']}' instead")
249
+ elif not isinstance(data[PAINTING_DATA], dict):
250
+ errors.append(f"PAINTING_DATA key should be a dictionary for '{item}'")
251
+ else:
252
+ painting_data = cast(JsonDict, data[PAINTING_DATA])
253
+ if painting_data.get("author") and not isinstance(painting_data["author"], dict | list | str):
254
+ errors.append(f"PAINTING_DATA 'author' key should be a Text Component for '{item}', got '{painting_data['author']}'")
255
+ if painting_data.get("title") and not isinstance(painting_data["title"], dict | list | str):
256
+ errors.append(f"PAINTING_DATA 'title' key should be a Text Component for '{item}', got '{painting_data['title']}'")
257
+ if not painting_data.get("width") or not isinstance(painting_data["width"], int) or painting_data["width"] < 1 or painting_data["width"] > 16:
258
+ errors.append(f"PAINTING_DATA should have an integer 'width' key between 1 and 16 for '{item}'")
259
+ if not painting_data.get("height") or not isinstance(painting_data["height"], int) or painting_data["height"] < 1 or painting_data["height"] > 16:
260
+ errors.append(f"PAINTING_DATA should have an integer 'height' key between 1 and 16 for '{item}'")
261
+
262
+ # Add missing data if needed
263
+ if "painting/variant" not in data:
264
+ data["painting/variant"] = f"{ctx.project_id}:{item}"
265
+
244
266
  # Log errors if any
245
267
  if errors:
246
268
  error("Errors found in the definitions during verification:\n- " + "\n- ".join(errors))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes