stewbeet 2.0.9__tar.gz → 2.0.11__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 (136) hide show
  1. {stewbeet-2.0.9 → stewbeet-2.0.11}/PKG-INFO +1 -1
  2. {stewbeet-2.0.9 → stewbeet-2.0.11}/pyproject.toml +1 -1
  3. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/__init__.py +1 -0
  4. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/pmc.py +1 -1
  5. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/auto/headers/object.py +63 -7
  6. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/auto/lang_file/__init__.py +1 -1
  7. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/custom_recipes/vanilla.py +3 -1
  8. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/datapack/loot_tables/__init__.py +10 -0
  9. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/initialize/__init__.py +10 -0
  10. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/resource_pack/item_models/object.py +41 -9
  11. {stewbeet-2.0.9 → stewbeet-2.0.11}/.gitignore +0 -0
  12. {stewbeet-2.0.9 → stewbeet-2.0.11}/LICENSE +0 -0
  13. {stewbeet-2.0.9 → stewbeet-2.0.11}/README.md +0 -0
  14. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/__main__.py +0 -0
  15. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/__init__.py +0 -0
  16. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/cd_utils.py +0 -0
  17. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/github.py +0 -0
  18. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/modrinth.py +0 -0
  19. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/continuous_delivery/smithed.py +0 -0
  20. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/__init__.py +0 -0
  21. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/__memory__.py +0 -0
  22. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/constants.py +0 -0
  23. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/__init__.py +0 -0
  24. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/completion.py +0 -0
  25. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/equipments.py +0 -0
  26. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/materials.py +0 -0
  27. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/records.py +0 -0
  28. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
  29. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/definitions_helper/text.py +0 -0
  30. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/ingredients.py +0 -0
  31. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/utils/io.py +0 -0
  32. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/core/utils/sounds.py +0 -0
  33. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/__init__.py +0 -0
  34. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/bookshelf.py +0 -0
  35. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/bookshelf_config.json +0 -0
  36. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
  37. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
  38. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
  39. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
  40. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
  41. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
  42. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
  43. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
  44. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
  45. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
  46. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
  47. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
  48. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
  49. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
  50. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
  51. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
  52. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
  53. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
  54. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
  55. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
  56. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
  57. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
  58. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
  59. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
  60. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
  61. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
  62. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
  63. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
  64. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
  65. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
  66. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
  67. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
  68. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
  69. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/archive/__init__.py +0 -0
  70. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/auto/headers/__init__.py +0 -0
  71. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
  72. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
  73. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
  74. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
  75. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
  76. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
  77. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
  78. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
  79. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
  80. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
  81. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
  82. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
  83. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
  84. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
  85. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
  86. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
  87. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
  88. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
  89. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
  90. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
  91. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
  92. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
  93. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
  94. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
  95. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
  96. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
  97. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
  98. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
  99. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
  100. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
  101. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
  102. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
  103. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
  104. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
  105. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
  106. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
  107. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/main.py +0 -0
  108. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/other_utils.py +0 -0
  109. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
  110. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/shared_import.py +0 -0
  111. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
  112. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
  113. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
  114. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
  115. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
  116. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
  117. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
  118. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
  119. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
  120. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
  121. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
  122. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
  123. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
  124. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
  125. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
  126. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
  127. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
  128. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
  129. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
  130. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
  131. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
  132. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
  133. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
  134. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
  135. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
  136. {stewbeet-2.0.9 → stewbeet-2.0.11}/stewbeet/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stewbeet
3
- Version: 2.0.9
3
+ Version: 2.0.11
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.0.9"
8
+ version = "2.0.11"
9
9
  description = "Beet Framework made to help generating advanced Minecraft datapack contents"
10
10
  readme = "README.md"
11
11
  license = "MIT"
@@ -3,6 +3,7 @@
3
3
  # Imports
4
4
  from beet import *
5
5
 
6
+ from .__main__ import main
6
7
  from .core import *
7
8
  from .plugins.initialize.source_lore_font import find_pack_png
8
9
  from .plugins.resource_pack.item_models.object import AutoModel
@@ -53,7 +53,7 @@ def convert_markdown_to_bbcode(markdown: str, verbose: bool = True) -> str:
53
53
  ...
54
54
  ... **Full Changelog**: https://github.com/Stoupy51/LifeSteal/compare/v1.2.2...v1.2.3
55
55
  ... '''
56
- >>> bbcode = convert_markdown_to_bbcode(markdown_text, verbose=True)
56
+ >>> bbcode = convert_markdown_to_bbcode(markdown_text, verbose=False)
57
57
  >>> print(bbcode.strip())
58
58
  [h2]Changelog[/h2][h4]Build System[/h4][list]
59
59
  [*]🚀 Bump version to v1.2.3 ([url=https://github.com/Stoupy51/LifeSteal/commit/2111fd2f390b80a3aab77a4e7bcbb24b93845e5a]2111fd2[/url])[/*]
@@ -58,6 +58,33 @@ class Header:
58
58
  ['Some info']
59
59
  >>> header.content
60
60
  'say Hello'
61
+
62
+ >>> alt_launch_content = '''
63
+ ... #> alt_launch
64
+ ... #
65
+ ... # @executed as the player & at current position
66
+ ... #
67
+ ... # @input macro target : string - target selector for position and rotation source
68
+ ... # @input macro time : int - time in ticks
69
+ ... # @input macro with : compound - additional arguments (optional)
70
+ ... # - yaw : float - yaw rotation (will override target rotation)
71
+ ... # - pitch : float - pitch rotation (will override target rotation)
72
+ ... # - go_side : float - how far to go side (0 = don't go side)
73
+ ... # - add_y : float - additional y position (default: 20.0)
74
+ ... # - particle : int - particle effect (0 = none, 1 = glow)
75
+ ... # - interpolation : int - teleport duration (default: 1)
76
+ ... # - delay : int - delay in ticks before starting (default: 0)
77
+ ... #
78
+ ... # @description Launch a cinematic that moves the player to the position and rotation of a target entity
79
+ ... #
80
+ ... # @example /execute as @s positioned 0 69 0 rotated -55 10 run function switch:cinematic/alt_launch
81
+ ... # {target:"@s",time:60,with:{go_side:1,add_y:20.0,particle:1,interpolation:1,delay:20}}
82
+ ... #
83
+ ...
84
+ ... function content here'''
85
+ >>> alt_header = Header.from_content("alt_launch", alt_launch_content)
86
+ >>> len(alt_header.other) > 10 # Should capture all the @executed, @input, @description, @example lines
87
+ True
61
88
  """
62
89
  # Initialize empty lists
63
90
  within: list[str] = []
@@ -81,25 +108,27 @@ class Header:
81
108
  within.append(func_name)
82
109
  i += 1
83
110
 
84
- # Skip empty lines
111
+ # Skip empty comment lines
85
112
  while i < len(lines) and lines[i].strip() == "#":
86
113
  i += 1
87
114
 
88
- # Parse other information
89
- while i < len(lines) and lines[i].strip().startswith("# "):
115
+ # Parse other information (without # prefix)
116
+ while i < len(lines) and lines[i].strip().startswith("#"):
90
117
  other_line: str = lines[i].strip()
91
- if other_line != "#":
92
- # Remove the # prefix and add to other
93
- other.append(other_line[2:].strip())
118
+ other.append(other_line[2:])
94
119
  i += 1
95
120
 
96
- # Skip empty lines
121
+ # Skip any remaining empty comment lines
97
122
  while i < len(lines) and lines[i].strip() == "#":
98
123
  i += 1
99
124
 
100
125
  # The remaining lines are the actual content
101
126
  actual_content = "\n".join(lines[i:]).strip()
102
127
 
128
+ if other and other[-1] == "":
129
+ # Remove the last empty line if it exists
130
+ other.pop()
131
+
103
132
  return cls(path, within, other, actual_content)
104
133
 
105
134
  def to_str(self) -> str:
@@ -148,3 +177,30 @@ class Header:
148
177
  header += "#\n"
149
178
  return (header + "\n" + self.content.strip() + "\n\n").replace("\n\n\n", "\n\n")
150
179
 
180
+ if __name__ == "__main__":
181
+ # Example usage
182
+ example_content = """
183
+ #> alt_launch
184
+ #
185
+ # @executed as the player & at current position
186
+ #
187
+ # @input macro target : string - target selector for position and rotation source
188
+ # @input macro time : int - time in ticks
189
+ # @input macro with : compound - additional arguments (optional)
190
+ # - yaw : float - yaw rotation (will override target rotation)
191
+ # - pitch : float - pitch rotation (will override target rotation)
192
+ # - go_side : float - how far to go side (0 = don't go side)
193
+ # - add_y : float - additional y position (default: 20.0)
194
+ # - particle : int - particle effect (0 = none, 1 = glow)
195
+ # - interpolation : int - teleport duration (default: 1)
196
+ # - delay : int - delay in ticks before starting (default: 0)
197
+ #
198
+ # @description Launch a cinematic that moves the player to the position and rotation of a target entity
199
+ #
200
+ # @example /execute as @s positioned 0 69 0 rotated -55 10 run function switch:cinematic/alt_launch {target:"@s",time:60,with:{go_side:1,add_y:20.0,particle:1,interpolation:1,delay:20}}
201
+ #
202
+
203
+ # Fonction content here
204
+ """
205
+ header = Header.from_content("alt_launch", example_content)
206
+ print(header.to_str())
@@ -32,6 +32,6 @@ def beet_default(ctx: Context):
32
32
 
33
33
  # Update the lang file
34
34
  lang.update(ctx.assets.languages.get("minecraft:en_us", Language()).data)
35
- ctx.assets.languages["minecraft:en_us"] = Language(super_json_dump(lang))
35
+ ctx.assets.languages["minecraft:en_us"] = Language(super_json_dump(dict(sorted(lang.items()))))
36
36
  pass
37
37
 
@@ -52,7 +52,9 @@ class VanillaRecipeHandler:
52
52
  "criteria": {"requirement": {"trigger": "minecraft:inventory_changed"}},
53
53
  "rewards": {"function": f"{Mem.ctx.project_id}:advancements/unlock_recipes"}
54
54
  }
55
- Mem.ctx.data[adv_path] = Advancement(super_json_dump(adv_json, max_level=-1))
55
+ adv = Advancement(adv_json)
56
+ adv.encoder = lambda x: super_json_dump(x, max_level=-1)
57
+ Mem.ctx.data[adv_path] = adv
56
58
 
57
59
  # Write the function that will unlock the recipes
58
60
  content = f"""
@@ -28,6 +28,9 @@ def beet_default(ctx: Context):
28
28
  assert ctx.project_id, "Project ID is not set. Please set it in the project configuration."
29
29
  ns: str = ctx.project_id
30
30
 
31
+ # Creative loot table (sort of give all loot table)
32
+ creative_loot_table: JsonDict = {"pools": []}
33
+
31
34
  # For each item in the definitions, create a loot table
32
35
  for item, data in Mem.definitions.items():
33
36
  loot_table: JsonDict = {
@@ -55,6 +58,9 @@ def beet_default(ctx: Context):
55
58
  # Create loot table with beet
56
59
  ctx.data[ns].loot_tables[f"i/{item}"] = LootTable(super_json_dump(loot_table, max_level = 10))
57
60
 
61
+ # Add the pool to the creative loot table
62
+ creative_loot_table["pools"].append({"rolls": 1, "entries":[{"type":"minecraft:loot_table","value":f"{ns}:i/{item}"}] })
63
+
58
64
  # Same for external items
59
65
  for item, data in Mem.external_definitions.items():
60
66
  ext_ns, item_name = item.split(":")
@@ -119,6 +125,10 @@ def beet_default(ctx: Context):
119
125
  }
120
126
  ctx.data[ns].loot_tables[f"i/{ns}_manual"] = LootTable(super_json_dump(loot_table, max_level=10))
121
127
 
128
+ # Write the creative loot table
129
+ if creative_loot_table["pools"]:
130
+ ctx.data[ns].loot_tables["creative_loot_table"] = LootTable(super_json_dump(creative_loot_table, max_level=2))
131
+
122
132
  # Make a give all command that gives chests with all the items
123
133
  CHEST_SIZE: int = 27
124
134
  total_chests: int = (len(Mem.definitions) + CHEST_SIZE - 1) // CHEST_SIZE
@@ -97,6 +97,16 @@ def beet_default(ctx: Context):
97
97
  if pack_icon:
98
98
  Mem.ctx.data.extra["pack.png"] = Mem.ctx.assets.extra["pack.png"] = PngFile(source_path=pack_icon)
99
99
 
100
+ # Add missing pack format registries if not present
101
+ ctx.data.pack_format_registry.update({
102
+ (1, 21, 5): 71,
103
+ (1, 21, 6): 80,
104
+ })
105
+ ctx.assets.pack_format_registry.update({
106
+ (1, 21, 5): 55,
107
+ (1, 21, 6): 63,
108
+ })
109
+
100
110
  # Yield message to indicate successful build
101
111
  yield
102
112
 
@@ -3,11 +3,12 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
+ from collections.abc import Iterable
6
7
 
7
8
  from beet import ItemModel, Model, Texture
8
9
  from beet.core.utils import JsonDict
10
+ from stouputils.decorators import LogLevels, handle_error, simple_cache
9
11
  from stouputils.io import super_json_dump, super_json_load
10
- from stouputils.print import error
11
12
 
12
13
  from ....core.__memory__ import Mem
13
14
  from ....core.constants import CUSTOM_BLOCK_VANILLA, CUSTOM_ITEM_VANILLA, OVERRIDE_MODEL
@@ -65,6 +66,7 @@ class AutoModel:
65
66
  """
66
67
  return cls(item_name, data, source_textures, ignore_textures)
67
68
 
69
+ @handle_error(exceptions=ValueError, error_log=LogLevels.ERROR_TRACEBACK)
68
70
  def get_powered_texture(self, variants: list[str], side: str, on_off: str) -> str:
69
71
  """ Get the powered texture for a given side.
70
72
 
@@ -84,7 +86,7 @@ class AutoModel:
84
86
  if texture.endswith(side):
85
87
  return texture
86
88
  if not self.ignore_textures:
87
- error(f"Couldn't find texture for side '{side}' in '{variants}', consider adding missing texture or override the model")
89
+ raise ValueError(f"Couldn't find texture for side '{side}' in '{variants}', consider adding missing texture or override the model")
88
90
  return ""
89
91
 
90
92
  def model_in_variants(self, models: list[str], variants: list[str]) -> bool:
@@ -99,12 +101,42 @@ class AutoModel:
99
101
  """
100
102
  return all(any(model in x for x in variants) for model in models)
101
103
 
104
+ @simple_cache
105
+ def get_same_folder_variants(self, variants: Iterable[str]) -> list[str]:
106
+ """ Get variants that are in the same folder as the item.
107
+
108
+ Args:
109
+ variants (Iterable[str]): Iterable of variant names.
110
+
111
+ Returns:
112
+ list[str]: List of variants in the same folder.
113
+ """
114
+ target_folder_depth: int = self.item_name.count('/')
115
+ same_folder_variants: list[str] = []
116
+ for variant in variants:
117
+ variant_folder_depth: int = variant.count('/')
118
+ if variant_folder_depth == target_folder_depth:
119
+ # Check if all folder parts before the filename are the same
120
+ if target_folder_depth == 0:
121
+ same_folder_variants.append(variant)
122
+ else:
123
+ target_folder: str = '/'.join(self.item_name.split('/')[:-1])
124
+ variant_folder: str = '/'.join(variant.split('/')[:-1])
125
+ if target_folder == variant_folder:
126
+ same_folder_variants.append(variant)
127
+ return same_folder_variants
128
+
129
+ @handle_error(exceptions=ValueError, error_log=LogLevels.ERROR_TRACEBACK)
102
130
  def process(self) -> None:
103
131
  """ Process the item model. """
104
132
  # If no item model, return
105
133
  if not self.data.get("item_model"):
106
134
  return
107
135
 
136
+ # If item_model is already processed, return
137
+ if self.data["item_model"] in Mem.ctx.meta["stewbeet"]["rendered_item_models"]:
138
+ return
139
+
108
140
  # Initialize variables
109
141
  if (self.data.get("id") == CUSTOM_BLOCK_VANILLA or
110
142
  any((isinstance(x, str) and "block" in x) for x in self.data.get(OVERRIDE_MODEL, {}).values())):
@@ -128,13 +160,13 @@ class AutoModel:
128
160
 
129
161
  # Generate its model file(s)
130
162
  for on_off in powered:
131
- content: dict = {}
132
-
133
- # Get all variants
134
- variants: list[str] = [
163
+ content: dict = {} # Get all variants
164
+ all_variants: list[str] = [
135
165
  x.replace(".png", "") for x in self.source_textures
136
- if "gui/" not in x and x.startswith(self.item_name)
166
+ if os.path.basename(x).startswith(self.item_name)
137
167
  ]
168
+ # Filter to only include variants in the same folder
169
+ variants: list[str] = self.get_same_folder_variants(all_variants)
138
170
 
139
171
  if self.data.get(OVERRIDE_MODEL, None) != {}:
140
172
  # If it's a block
@@ -188,7 +220,7 @@ class AutoModel:
188
220
  "orientable": orientable,
189
221
  "cube_column": cube_column
190
222
  }, max_level=1)
191
- error(
223
+ raise ValueError(
192
224
  f"Block '{self.item_name}' has invalid variants: {variants},\n"
193
225
  "consider overriding the model or adding missing textures to match up one of the following patterns:"
194
226
  f"\n{patterns}"
@@ -297,7 +329,7 @@ class AutoModel:
297
329
  Mem.ctx.assets[texture] = Texture(source_path=self.source_textures[texture_name], mcmeta=mcmeta)
298
330
  else:
299
331
  if not self.ignore_textures:
300
- error(f"Texture '{texture_name}' not found in source textures")
332
+ raise ValueError(f"Texture '{texture_name}' not found in source textures")
301
333
 
302
334
  # Add model to assets
303
335
  if self.data.get(OVERRIDE_MODEL, None) != {}:
File without changes
File without changes
File without changes
File without changes
File without changes