stewbeet 2.0.15__tar.gz → 2.0.17__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.
- {stewbeet-2.0.15 → stewbeet-2.0.17}/PKG-INFO +1 -1
- {stewbeet-2.0.15 → stewbeet-2.0.17}/pyproject.toml +1 -1
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/__init__.py +5 -0
- stewbeet-2.0.17/stewbeet/all.py +50 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/constants.py +6 -6
- stewbeet-2.0.17/stewbeet/core/utils/io.py +161 -0
- stewbeet-2.0.17/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
- stewbeet-2.0.17/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
- stewbeet-2.0.17/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
- stewbeet-2.0.17/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/archive/__init__.py +12 -0
- stewbeet-2.0.17/stewbeet/plugins/finalyze/last_final/__init__.py +30 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/initialize/__init__.py +109 -124
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/initialize/source_lore_font.py +7 -0
- stewbeet-2.0.15/stewbeet/core/utils/io.py +0 -136
- stewbeet-2.0.15/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
- stewbeet-2.0.15/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
- stewbeet-2.0.15/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
- stewbeet-2.0.15/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/.gitignore +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/LICENSE +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/README.md +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/__main__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/cd_utils.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/github.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/modrinth.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/pmc.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/continuous_delivery/smithed.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/__memory__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/completion.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/equipments.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/materials.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/records.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/definitions_helper/text.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/ingredients.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/core/utils/sounds.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/bookshelf.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/bookshelf_config.json +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/headers/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/headers/object.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/craft_content.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/main.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/other_utils.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/page_font.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/shared_import.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
- {stewbeet-2.0.15 → stewbeet-2.0.17}/stewbeet/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stewbeet
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.17
|
|
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
|
|
@@ -9,3 +9,8 @@ from .plugins.initialize.source_lore_font import find_pack_png
|
|
|
9
9
|
from .plugins.resource_pack.item_models.object import AutoModel
|
|
10
10
|
from .plugins.resource_pack.sounds import add_sound
|
|
11
11
|
|
|
12
|
+
|
|
13
|
+
def beet_default(ctx: Context):
|
|
14
|
+
""" Initializes the StewBeet package. """
|
|
15
|
+
ctx.require("stewbeet.plugins.initialize")
|
|
16
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
# Imports
|
|
3
|
+
from beet import Context
|
|
4
|
+
|
|
5
|
+
# Constants
|
|
6
|
+
GENERATION_PLUGINS = (
|
|
7
|
+
"stewbeet.plugins.verify_definitions",
|
|
8
|
+
"stewbeet.plugins.resource_pack.sounds",
|
|
9
|
+
"stewbeet.plugins.resource_pack.item_models",
|
|
10
|
+
"stewbeet.plugins.resource_pack.check_power_of_2",
|
|
11
|
+
"stewbeet.plugins.custom_recipes",
|
|
12
|
+
"stewbeet.plugins.ingame_manual",
|
|
13
|
+
"stewbeet.plugins.datapack.loading",
|
|
14
|
+
"stewbeet.plugins.datapack.custom_blocks",
|
|
15
|
+
"stewbeet.plugins.datapack.loot_tables",
|
|
16
|
+
"stewbeet.plugins.compatibilities.simpledrawer",
|
|
17
|
+
"stewbeet.plugins.compatibilities.neo_enchant"
|
|
18
|
+
)
|
|
19
|
+
FINALYZE_PLUGINS = (
|
|
20
|
+
"stewbeet.plugins.finalyze.custom_blocks_ticking",
|
|
21
|
+
"stewbeet.plugins.finalyze.basic_datapack_structure",
|
|
22
|
+
"stewbeet.plugins.finalyze.dependencies",
|
|
23
|
+
"stewbeet.plugins.finalyze.check_unused_textures",
|
|
24
|
+
"stewbeet.plugins.finalyze.last_final",
|
|
25
|
+
"stewbeet.plugins.auto.headers",
|
|
26
|
+
"stewbeet.plugins.archive",
|
|
27
|
+
"stewbeet.plugins.merge_smithed_weld",
|
|
28
|
+
"stewbeet.plugins.copy_to_destination",
|
|
29
|
+
"stewbeet.plugins.compute_sha1"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def beet_default(ctx: Context):
|
|
33
|
+
""" Run all plugins that should run after definitions are loaded.
|
|
34
|
+
This function will yield before finalizing the project (so users can run their own plugins in the middle of the pipeline).
|
|
35
|
+
|
|
36
|
+
Requires:
|
|
37
|
+
- StewBeet to be initialized (e.g. from stewbeet.plugins.initialize).
|
|
38
|
+
- Definitions to be loaded
|
|
39
|
+
"""
|
|
40
|
+
# Assertions
|
|
41
|
+
for x in GENERATION_PLUGINS:
|
|
42
|
+
ctx.require(x)
|
|
43
|
+
|
|
44
|
+
# Yield to allow user code to run
|
|
45
|
+
yield
|
|
46
|
+
|
|
47
|
+
# After user code, run the final plugins
|
|
48
|
+
for x in FINALYZE_PLUGINS:
|
|
49
|
+
ctx.require(x)
|
|
50
|
+
|
|
@@ -90,12 +90,12 @@ def official_lib_used(lib: str) -> bool:
|
|
|
90
90
|
return is_used
|
|
91
91
|
|
|
92
92
|
OFFICIAL_LIBS: dict[str, dict] = {
|
|
93
|
-
"common_signals": {"version":[0, 1,
|
|
94
|
-
"smithed.custom_block": {"version":[0, 7,
|
|
95
|
-
"smithed.crafter": {"version":[0, 7,
|
|
96
|
-
"furnace_nbt_recipes": {"version":[1, 9,
|
|
97
|
-
"smart_ore_generation": {"version":[1, 7,
|
|
98
|
-
"itemio": {"version":[1, 4,
|
|
93
|
+
"common_signals": {"version":[0, 1, 1], "name":"Common Signals", "url":"https://github.com/Stoupy51/CommonSignals", "is_used": False},
|
|
94
|
+
"smithed.custom_block": {"version":[0, 7, 1], "name":"Smithed Custom Block", "url":"https://wiki.smithed.dev/libraries/custom-block/", "is_used": False},
|
|
95
|
+
"smithed.crafter": {"version":[0, 7, 1], "name":"Smithed Crafter", "url":"https://wiki.smithed.dev/libraries/crafter/", "is_used": False},
|
|
96
|
+
"furnace_nbt_recipes": {"version":[1, 9, 1], "name":"Furnace NBT Recipes", "url":"https://github.com/Stoupy51/FurnaceNbtRecipes", "is_used": False},
|
|
97
|
+
"smart_ore_generation": {"version":[1, 7, 2], "name":"SmartOreGeneration", "url":"https://github.com/Stoupy51/SmartOreGeneration", "is_used": False},
|
|
98
|
+
"itemio": {"version":[1, 4, 1], "name":"ItemIO", "url":"https://github.com/edayot/ItemIO", "is_used": False},
|
|
99
99
|
**BOOKSHELF_MODULES,
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
|
|
2
|
+
# Imports
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from beet import Function, FunctionTag, JsonFile
|
|
6
|
+
from beet.core.utils import JsonDict
|
|
7
|
+
from stouputils.collections import unique_list
|
|
8
|
+
from stouputils.io import super_json_dump
|
|
9
|
+
|
|
10
|
+
from ..__memory__ import Mem
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Functions
|
|
14
|
+
def write_function_tag(path: str, functions: list[Any] | None = None, prepend: bool = False) -> None:
|
|
15
|
+
""" Write a function tag at the given path.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
path (str): The path to the function tag (ex: "namespace:something" for 'data/namespace/tags/function/something.json')
|
|
19
|
+
functions (list[Any] | None): The functions to add to the tag
|
|
20
|
+
prepend (bool): If the functions should be prepended instead of appended
|
|
21
|
+
"""
|
|
22
|
+
if path.endswith(".json"):
|
|
23
|
+
path = path[:-len(".json")]
|
|
24
|
+
tag: FunctionTag = Mem.ctx.data.function_tags.setdefault(path)
|
|
25
|
+
data: JsonDict = tag.data
|
|
26
|
+
if not data.get("values"):
|
|
27
|
+
data["values"] = functions or []
|
|
28
|
+
|
|
29
|
+
if prepend:
|
|
30
|
+
data["values"] = functions + data["values"]
|
|
31
|
+
else:
|
|
32
|
+
data["values"].extend(functions or [])
|
|
33
|
+
data["values"] = unique_list(data["values"])
|
|
34
|
+
tag.encoder = super_json_dump
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def read_function(path: str) -> str:
|
|
38
|
+
""" Read the content of a function at the given path.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
path (str): The path to the function (ex: "namespace:folder/function_name")
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
str: The content of the function
|
|
45
|
+
"""
|
|
46
|
+
if path.endswith(".mcfunction"):
|
|
47
|
+
path = path[:-len(".mcfunction")]
|
|
48
|
+
return Mem.ctx.data.functions[path].text
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def write_function(path: str, content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
|
|
52
|
+
""" Write the content to the function at the given path.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
path (str): The path to the function (ex: "namespace:folder/function_name")
|
|
56
|
+
content (str): The content to write
|
|
57
|
+
overwrite (bool): If the file should be overwritten (default: Append the content)
|
|
58
|
+
prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
|
|
59
|
+
tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
|
|
60
|
+
"""
|
|
61
|
+
if path.endswith(".mcfunction"):
|
|
62
|
+
path = path[:-len(".mcfunction")]
|
|
63
|
+
if overwrite:
|
|
64
|
+
Mem.ctx.data.functions[path] = Function(content)
|
|
65
|
+
else:
|
|
66
|
+
if prepend:
|
|
67
|
+
Mem.ctx.data.functions.setdefault(path).prepend(content)
|
|
68
|
+
else:
|
|
69
|
+
Mem.ctx.data.functions.setdefault(path).append(content)
|
|
70
|
+
if tags:
|
|
71
|
+
for tag in tags:
|
|
72
|
+
write_function_tag(tag, [path], prepend)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def write_load_file(content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
|
|
76
|
+
""" Write the content to the load file
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
content (str): The content to write
|
|
80
|
+
overwrite (bool): If the file should be overwritten (default: Append the content)
|
|
81
|
+
prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
|
|
82
|
+
tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
|
|
83
|
+
"""
|
|
84
|
+
write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/load/confirm_load", content, overwrite, prepend, tags)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def write_tick_file(content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
|
|
88
|
+
""" Write the content to the tick file
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
content (str): The content to write
|
|
92
|
+
overwrite (bool): If the file should be overwritten (default: Append the content)
|
|
93
|
+
prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
|
|
94
|
+
tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
|
|
95
|
+
"""
|
|
96
|
+
write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/tick", content, overwrite, prepend, tags)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def write_versioned_function(path: str, content: str, overwrite: bool = False, prepend: bool = False, tags: list[str] | None = None) -> None:
|
|
100
|
+
""" Write the content to a versioned function at the given path.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
path (str): The path to the function (ex: "folder/function_name")
|
|
104
|
+
content (str): The content to write
|
|
105
|
+
overwrite (bool): If the file should be overwritten (default: Append the content)
|
|
106
|
+
prepend (bool): If the content should be prepended instead of appended (not used if overwrite is True)
|
|
107
|
+
tags (list[str] | None): The function tags to add to the function (ex: ["namespace:something"] for 'data/namespace/tags/function/something.json')
|
|
108
|
+
"""
|
|
109
|
+
write_function(f"{Mem.ctx.project_id}:v{Mem.ctx.project_version}/{path}", content, overwrite, prepend, tags)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# Merge two dict recuirsively
|
|
113
|
+
def super_merge_dict(dict1: dict, dict2: dict) -> dict:
|
|
114
|
+
""" Merge the two dictionnaries recursively without modifying originals
|
|
115
|
+
Args:
|
|
116
|
+
dict1 (dict): The first dictionnary
|
|
117
|
+
dict2 (dict): The second dictionnary
|
|
118
|
+
Returns:
|
|
119
|
+
dict: The merged dictionnary
|
|
120
|
+
"""
|
|
121
|
+
# Copy first dictionnary
|
|
122
|
+
new_dict = {}
|
|
123
|
+
for key, value in dict1.items():
|
|
124
|
+
new_dict[key] = value
|
|
125
|
+
|
|
126
|
+
# For each key of the second dictionnary,
|
|
127
|
+
for key, value in dict2.items():
|
|
128
|
+
|
|
129
|
+
# If key exists in dict1, and both values are also dict, merge recursively
|
|
130
|
+
if key in dict1 and isinstance(dict1[key], dict) and isinstance(value, dict):
|
|
131
|
+
new_dict[key] = super_merge_dict(dict1[key], value)
|
|
132
|
+
|
|
133
|
+
# Else if it's a list, merge it
|
|
134
|
+
elif key in dict1 and isinstance(dict1[key], list) and isinstance(value, list):
|
|
135
|
+
new_dict[key] = dict1[key] + value
|
|
136
|
+
if not any(isinstance(x, dict) for x in new_dict[key]):
|
|
137
|
+
new_dict[key] = unique_list(new_dict[key])
|
|
138
|
+
|
|
139
|
+
# Else, just overwrite or add value
|
|
140
|
+
else:
|
|
141
|
+
new_dict[key] = value
|
|
142
|
+
|
|
143
|
+
# Return the new dict
|
|
144
|
+
return new_dict
|
|
145
|
+
|
|
146
|
+
def set_json_encoder(obj: JsonFile, max_level: int | None = None, indent: str | int = '\t') -> JsonFile:
|
|
147
|
+
""" Set the encoder of the given object to super_json_dump
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
obj (JsonFile): The object to set the encoder for
|
|
151
|
+
max_level (int | None): The maximum level of the JSON dump, or None for default behavior
|
|
152
|
+
indent (str | int): The indentation character (default: '\t')
|
|
153
|
+
Returns:
|
|
154
|
+
JsonFile: The object with the encoder set
|
|
155
|
+
"""
|
|
156
|
+
if max_level is None:
|
|
157
|
+
obj.encoder = lambda x: super_json_dump(x, indent=indent)
|
|
158
|
+
else:
|
|
159
|
+
obj.encoder = lambda x: super_json_dump(x, max_level=max_level, indent=indent)
|
|
160
|
+
return obj
|
|
161
|
+
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -10,6 +10,8 @@ from stouputils.decorators import handle_error, measure_time
|
|
|
10
10
|
from stouputils.parallel import multithreading
|
|
11
11
|
from stouputils.print import progress
|
|
12
12
|
|
|
13
|
+
from ..initialize.source_lore_font import find_pack_png
|
|
14
|
+
|
|
13
15
|
|
|
14
16
|
def get_consistent_timestamp(ctx: Context) -> tuple[int, ...]:
|
|
15
17
|
""" Get a consistent timestamp for archive files based on beet cache .gitignore file modification time. """
|
|
@@ -79,6 +81,16 @@ def beet_default(ctx: Context) -> None:
|
|
|
79
81
|
for item in temp_zip.filelist:
|
|
80
82
|
temp_contents[item.filename] = temp_zip.read(item.filename)
|
|
81
83
|
|
|
84
|
+
# Check if pack.png exists and prepare it
|
|
85
|
+
pack_png_path = find_pack_png()
|
|
86
|
+
if pack_png_path:
|
|
87
|
+
# Remove pack.png from temp_contents if it exists to avoid duplicates
|
|
88
|
+
temp_contents.pop("pack.png", None)
|
|
89
|
+
|
|
90
|
+
# Read pack.png content
|
|
91
|
+
with open(pack_png_path, "rb") as f:
|
|
92
|
+
temp_contents["pack.png"] = f.read()
|
|
93
|
+
|
|
82
94
|
# Recreate the zip file with proper timestamps and compression
|
|
83
95
|
with zipfile.ZipFile(archive_path, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=6) as final_zip:
|
|
84
96
|
for filename, content in temp_contents.items():
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
# Imports
|
|
3
|
+
from beet import Context, PngFile
|
|
4
|
+
from stouputils.decorators import measure_time
|
|
5
|
+
from stouputils.print import progress
|
|
6
|
+
|
|
7
|
+
from ....core import Mem
|
|
8
|
+
from ...initialize.source_lore_font import create_source_lore_font, find_pack_png
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Main entry point
|
|
12
|
+
@measure_time(progress, message="Execution time of 'stewbeet.plugins.finalyze.last_final'")
|
|
13
|
+
def beet_default(ctx: Context):
|
|
14
|
+
|
|
15
|
+
# If source lore is present and there are item definitions using it, create the source lore font
|
|
16
|
+
src_lore: str = Mem.ctx.meta.stewbeet.get("pack_icon_path", "")
|
|
17
|
+
if src_lore and Mem.ctx.meta.stewbeet.source_lore and any(
|
|
18
|
+
Mem.ctx.meta.stewbeet.source_lore in data.get("lore", [])
|
|
19
|
+
for data in Mem.definitions.values()
|
|
20
|
+
):
|
|
21
|
+
create_source_lore_font(src_lore)
|
|
22
|
+
|
|
23
|
+
# Add the pack icon to the output directory for datapack and resource pack
|
|
24
|
+
pack_icon = find_pack_png()
|
|
25
|
+
if pack_icon:
|
|
26
|
+
Mem.ctx.data.extra["pack.png"] = PngFile(source_path=pack_icon)
|
|
27
|
+
all_assets = set(Mem.ctx.assets.all())
|
|
28
|
+
if len(all_assets) > 0:
|
|
29
|
+
Mem.ctx.assets.extra["pack.png"] = PngFile(source_path=pack_icon)
|
|
30
|
+
|
|
@@ -1,124 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
# Imports
|
|
3
|
-
import os
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
from beet import Context, Pack
|
|
7
|
-
from beet.core.utils import JsonDict, TextComponent
|
|
8
|
-
from box import Box
|
|
9
|
-
from stouputils import relative_path
|
|
10
|
-
from stouputils.decorators import measure_time
|
|
11
|
-
from stouputils.io import super_json_dump
|
|
12
|
-
from stouputils.print import warning
|
|
13
|
-
|
|
14
|
-
from ...core import Mem
|
|
15
|
-
from .source_lore_font import
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# Main entry point
|
|
19
|
-
@measure_time(message="Total execution time", is_generator=True)
|
|
20
|
-
def beet_default(ctx: Context):
|
|
21
|
-
|
|
22
|
-
# Assertions
|
|
23
|
-
assert ctx.project_id, "Project ID must be set in the project configuration."
|
|
24
|
-
|
|
25
|
-
# Store the Box object in ctx for access throughout the codebase
|
|
26
|
-
meta_box: Box = Box(ctx.meta, default_box=True, default_box_attr={})
|
|
27
|
-
object.__setattr__(ctx, "meta", meta_box) # Bypass FrozenInstanceError
|
|
28
|
-
Mem.ctx = ctx
|
|
29
|
-
|
|
30
|
-
# Preprocess project description
|
|
31
|
-
project_description: TextComponent = Mem.ctx.meta.stewbeet.project_description
|
|
32
|
-
if not project_description or project_description == "auto":
|
|
33
|
-
# Use project name, version, and author to create a default description
|
|
34
|
-
Mem.ctx.meta.stewbeet.project_description = f"{ctx.project_name} [{ctx.project_version}] by {ctx.project_author}"
|
|
35
|
-
|
|
36
|
-
# Preprocess source lore
|
|
37
|
-
source_lore: TextComponent = Mem.ctx.meta.stewbeet.source_lore
|
|
38
|
-
if not source_lore or source_lore == "auto":
|
|
39
|
-
Mem.ctx.meta.stewbeet.source_lore = [{"text":"ICON"},{"text":f" {ctx.project_name}","italic":True,"color":"blue"}]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# Preprocess manual name
|
|
43
|
-
manual_name: TextComponent = Mem.ctx.meta.stewbeet.manual.name
|
|
44
|
-
if not manual_name:
|
|
45
|
-
Mem.ctx.meta.stewbeet.manual.name = f"{ctx.project_name} Manual"
|
|
46
|
-
|
|
47
|
-
# Convert paths to relative ones
|
|
48
|
-
object.__setattr__(ctx, "output_directory", relative_path(Mem.ctx.output_directory))
|
|
49
|
-
|
|
50
|
-
# Helper function to setup pack.mcmeta
|
|
51
|
-
def setup_pack_mcmeta(pack: Pack, pack_format: int):
|
|
52
|
-
existing_mcmeta = pack.mcmeta.data or {}
|
|
53
|
-
pack_mcmeta: JsonDict = {"pack": {}}
|
|
54
|
-
pack_mcmeta.update(existing_mcmeta)
|
|
55
|
-
pack_mcmeta["pack"].update(existing_mcmeta.get("pack", {}))
|
|
56
|
-
pack_mcmeta["pack"]["pack_format"] = pack_format
|
|
57
|
-
pack_mcmeta["pack"]["description"] = Mem.ctx.meta.stewbeet.project_description
|
|
58
|
-
pack_mcmeta["id"] = Mem.ctx.project_id
|
|
59
|
-
pack.mcmeta.data = pack_mcmeta
|
|
60
|
-
pack.mcmeta.encoder = super_json_dump
|
|
61
|
-
|
|
62
|
-
# Setup pack.mcmeta for both packs
|
|
63
|
-
setup_pack_mcmeta(ctx.data, ctx.data.pack_format)
|
|
64
|
-
setup_pack_mcmeta(ctx.assets, ctx.assets.pack_format)
|
|
65
|
-
|
|
66
|
-
# Convert texture names if needed (from old legacy system)
|
|
67
|
-
textures_folder = Mem.ctx.meta.stewbeet.get("textures_folder")
|
|
68
|
-
if textures_folder and Path(textures_folder).exists():
|
|
69
|
-
REPLACEMENTS = {
|
|
70
|
-
"_off": "",
|
|
71
|
-
"_down": "_bottom",
|
|
72
|
-
"_up": "_top",
|
|
73
|
-
"_north": "_front",
|
|
74
|
-
"_south": "_back",
|
|
75
|
-
"_west": "_left",
|
|
76
|
-
"_east": "_right",
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
# Get all texture files
|
|
80
|
-
texture_files = [f for f in os.listdir(textures_folder) if f.endswith(('.png', '.jpg', '.jpeg', ".mcmeta"))]
|
|
81
|
-
|
|
82
|
-
for file in texture_files:
|
|
83
|
-
new_name = file.lower()
|
|
84
|
-
for k, v in REPLACEMENTS.items():
|
|
85
|
-
if k in file:
|
|
86
|
-
new_name = new_name.replace(k, v)
|
|
87
|
-
|
|
88
|
-
if new_name != file:
|
|
89
|
-
old_path = Path(textures_folder) / file
|
|
90
|
-
new_path = Path(textures_folder) / new_name
|
|
91
|
-
if old_path.exists() and not new_path.exists():
|
|
92
|
-
os.rename(old_path, new_path)
|
|
93
|
-
warning(f"Renamed texture '{file}' to '{new_name}'")
|
|
94
|
-
|
|
95
|
-
# Add missing pack format registries if not present
|
|
96
|
-
ctx.data.pack_format_registry.update({
|
|
97
|
-
(1, 21, 5): 71,
|
|
98
|
-
(1, 21, 6): 80,
|
|
99
|
-
(1, 21, 7): 81,
|
|
100
|
-
})
|
|
101
|
-
ctx.assets.pack_format_registry.update({
|
|
102
|
-
(1, 21, 5): 55,
|
|
103
|
-
(1, 21, 6): 63,
|
|
104
|
-
(1, 21, 7): 64,
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
# Yield message to indicate successful build
|
|
108
|
-
yield
|
|
109
|
-
|
|
110
|
-
# If source lore is present and there are item definitions using it, create the source lore font
|
|
111
|
-
if src_lore and Mem.ctx.meta.stewbeet.source_lore and any(
|
|
112
|
-
Mem.ctx.meta.stewbeet.source_lore in data.get("lore", [])
|
|
113
|
-
for data in Mem.definitions.values()
|
|
114
|
-
):
|
|
115
|
-
create_source_lore_font(src_lore)
|
|
116
|
-
|
|
117
|
-
# Add the pack icon to the output directory for datapack and resource pack
|
|
118
|
-
pack_icon = find_pack_png()
|
|
119
|
-
if pack_icon:
|
|
120
|
-
Mem.ctx.data.extra["pack.png"] = PngFile(source_path=pack_icon)
|
|
121
|
-
all_assets = set(Mem.ctx.assets.all())
|
|
122
|
-
if len(all_assets) > 0:
|
|
123
|
-
Mem.ctx.assets.extra["pack.png"] = PngFile(source_path=pack_icon)
|
|
124
|
-
|
|
1
|
+
|
|
2
|
+
# Imports
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from beet import Context, Pack
|
|
7
|
+
from beet.core.utils import JsonDict, TextComponent
|
|
8
|
+
from box import Box
|
|
9
|
+
from stouputils import relative_path
|
|
10
|
+
from stouputils.decorators import measure_time
|
|
11
|
+
from stouputils.io import super_json_dump
|
|
12
|
+
from stouputils.print import warning
|
|
13
|
+
|
|
14
|
+
from ...core import Mem
|
|
15
|
+
from .source_lore_font import prepare_source_lore_font
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Main entry point
|
|
19
|
+
@measure_time(message="Total execution time", is_generator=True)
|
|
20
|
+
def beet_default(ctx: Context):
|
|
21
|
+
|
|
22
|
+
# Assertions
|
|
23
|
+
assert ctx.project_id, "Project ID must be set in the project configuration."
|
|
24
|
+
|
|
25
|
+
# Store the Box object in ctx for access throughout the codebase
|
|
26
|
+
meta_box: Box = Box(ctx.meta, default_box=True, default_box_attr={})
|
|
27
|
+
object.__setattr__(ctx, "meta", meta_box) # Bypass FrozenInstanceError
|
|
28
|
+
Mem.ctx = ctx
|
|
29
|
+
|
|
30
|
+
# Preprocess project description
|
|
31
|
+
project_description: TextComponent = Mem.ctx.meta.stewbeet.project_description
|
|
32
|
+
if not project_description or project_description == "auto":
|
|
33
|
+
# Use project name, version, and author to create a default description
|
|
34
|
+
Mem.ctx.meta.stewbeet.project_description = f"{ctx.project_name} [{ctx.project_version}] by {ctx.project_author}"
|
|
35
|
+
|
|
36
|
+
# Preprocess source lore
|
|
37
|
+
source_lore: TextComponent = Mem.ctx.meta.stewbeet.source_lore
|
|
38
|
+
if not source_lore or source_lore == "auto":
|
|
39
|
+
Mem.ctx.meta.stewbeet.source_lore = [{"text":"ICON"},{"text":f" {ctx.project_name}","italic":True,"color":"blue"}]
|
|
40
|
+
Mem.ctx.meta.stewbeet["pack_icon_path"] = prepare_source_lore_font(Mem.ctx.meta.stewbeet.source_lore)
|
|
41
|
+
|
|
42
|
+
# Preprocess manual name
|
|
43
|
+
manual_name: TextComponent = Mem.ctx.meta.stewbeet.manual.name
|
|
44
|
+
if not manual_name:
|
|
45
|
+
Mem.ctx.meta.stewbeet.manual.name = f"{ctx.project_name} Manual"
|
|
46
|
+
|
|
47
|
+
# Convert paths to relative ones
|
|
48
|
+
object.__setattr__(ctx, "output_directory", relative_path(Mem.ctx.output_directory))
|
|
49
|
+
|
|
50
|
+
# Helper function to setup pack.mcmeta
|
|
51
|
+
def setup_pack_mcmeta(pack: Pack, pack_format: int):
|
|
52
|
+
existing_mcmeta = pack.mcmeta.data or {}
|
|
53
|
+
pack_mcmeta: JsonDict = {"pack": {}}
|
|
54
|
+
pack_mcmeta.update(existing_mcmeta)
|
|
55
|
+
pack_mcmeta["pack"].update(existing_mcmeta.get("pack", {}))
|
|
56
|
+
pack_mcmeta["pack"]["pack_format"] = pack_format
|
|
57
|
+
pack_mcmeta["pack"]["description"] = Mem.ctx.meta.stewbeet.project_description
|
|
58
|
+
pack_mcmeta["id"] = Mem.ctx.project_id
|
|
59
|
+
pack.mcmeta.data = pack_mcmeta
|
|
60
|
+
pack.mcmeta.encoder = super_json_dump
|
|
61
|
+
|
|
62
|
+
# Setup pack.mcmeta for both packs
|
|
63
|
+
setup_pack_mcmeta(ctx.data, ctx.data.pack_format)
|
|
64
|
+
setup_pack_mcmeta(ctx.assets, ctx.assets.pack_format)
|
|
65
|
+
|
|
66
|
+
# Convert texture names if needed (from old legacy system)
|
|
67
|
+
textures_folder = Mem.ctx.meta.stewbeet.get("textures_folder")
|
|
68
|
+
if textures_folder and Path(textures_folder).exists():
|
|
69
|
+
REPLACEMENTS = {
|
|
70
|
+
"_off": "",
|
|
71
|
+
"_down": "_bottom",
|
|
72
|
+
"_up": "_top",
|
|
73
|
+
"_north": "_front",
|
|
74
|
+
"_south": "_back",
|
|
75
|
+
"_west": "_left",
|
|
76
|
+
"_east": "_right",
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Get all texture files
|
|
80
|
+
texture_files = [f for f in os.listdir(textures_folder) if f.endswith(('.png', '.jpg', '.jpeg', ".mcmeta"))]
|
|
81
|
+
|
|
82
|
+
for file in texture_files:
|
|
83
|
+
new_name = file.lower()
|
|
84
|
+
for k, v in REPLACEMENTS.items():
|
|
85
|
+
if k in file:
|
|
86
|
+
new_name = new_name.replace(k, v)
|
|
87
|
+
|
|
88
|
+
if new_name != file:
|
|
89
|
+
old_path = Path(textures_folder) / file
|
|
90
|
+
new_path = Path(textures_folder) / new_name
|
|
91
|
+
if old_path.exists() and not new_path.exists():
|
|
92
|
+
os.rename(old_path, new_path)
|
|
93
|
+
warning(f"Renamed texture '{file}' to '{new_name}'")
|
|
94
|
+
|
|
95
|
+
# Add missing pack format registries if not present
|
|
96
|
+
ctx.data.pack_format_registry.update({
|
|
97
|
+
(1, 21, 5): 71,
|
|
98
|
+
(1, 21, 6): 80,
|
|
99
|
+
(1, 21, 7): 81,
|
|
100
|
+
})
|
|
101
|
+
ctx.assets.pack_format_registry.update({
|
|
102
|
+
(1, 21, 5): 55,
|
|
103
|
+
(1, 21, 6): 63,
|
|
104
|
+
(1, 21, 7): 64,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
# Yield message to indicate successful build
|
|
108
|
+
yield
|
|
109
|
+
|
|
@@ -63,3 +63,10 @@ def create_source_lore_font(pack_icon: str) -> None:
|
|
|
63
63
|
image = image.resize((256, 256))
|
|
64
64
|
Mem.ctx.assets[Mem.ctx.project_id].textures["font/original_icon"] = Texture(image)
|
|
65
65
|
|
|
66
|
+
def delete_source_lore_font() -> None:
|
|
67
|
+
""" Delete the source lore font if it exists. """
|
|
68
|
+
if Mem.ctx.assets[Mem.ctx.project_id].fonts.get("icons"):
|
|
69
|
+
del Mem.ctx.assets[Mem.ctx.project_id].fonts["icons"]
|
|
70
|
+
if Mem.ctx.assets[Mem.ctx.project_id].textures.get("font/original_icon"):
|
|
71
|
+
del Mem.ctx.assets[Mem.ctx.project_id].textures["font/original_icon"]
|
|
72
|
+
|