stewbeet 2.2.21__tar.gz → 2.2.23__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.2.21 → stewbeet-2.2.23}/PKG-INFO +2 -2
- {stewbeet-2.2.21 → stewbeet-2.2.23}/pyproject.toml +2 -2
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/constants.py +1 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/materials.py +54 -52
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/ingredients.py +58 -9
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/__init__.py +3 -1
- stewbeet-2.2.23/stewbeet/plugins/custom_recipes/awakened_forge.py +174 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_1.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_2.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x3.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/assets/awakened_forge_3x4.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/craft_content.py +123 -1
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/dialog.py +11 -4
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/iso_renders.py +2 -2
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/main.py +54 -14
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/other_utils.py +20 -3
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/page_font.py +10 -9
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/shared_import.py +7 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/stardust_forge.py +32 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/1book.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_1.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_2.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x3.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/awakened_forge_3x4.png +0 -0
- stewbeet-2.2.23/stewbeet/plugins/ingame_manual/templates/donut_holer.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/item_models/object.py +6 -2
- {stewbeet-2.2.21 → stewbeet-2.2.23}/.gitignore +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/LICENSE +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/README.md +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/__main__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/all.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/cli.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/cd_utils.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/github.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/modrinth.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/pmc.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/continuous_delivery/smithed.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/balancing.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/batteries.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/cables.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/gui.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/py.typed +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/contrib/simplenergy/wrench.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/__memory__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/completion.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/equipments.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/records.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/definitions_helper/text.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/utils/io.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/core/utils/sounds.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/bookshelf.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/bookshelf_config.json +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/archive/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/headers/object.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_paintings/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/match.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/book.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/book_components.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/image_utils.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/_README.md +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/book.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/initialize/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/py.typed +0 -0
- {stewbeet-2.2.21 → stewbeet-2.2.23}/stewbeet/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stewbeet
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.23
|
|
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
|
|
@@ -14,7 +14,7 @@ Requires-Python: >=3.12
|
|
|
14
14
|
Requires-Dist: beet>=0.112.0
|
|
15
15
|
Requires-Dist: bolt>=0.49.2
|
|
16
16
|
Requires-Dist: mecha>=0.99.0
|
|
17
|
-
Requires-Dist: model-resolver>=1.11.
|
|
17
|
+
Requires-Dist: model-resolver>=1.11.2
|
|
18
18
|
Requires-Dist: mutagen>=1.47.0
|
|
19
19
|
Requires-Dist: pyperclip>=1.8.0
|
|
20
20
|
Requires-Dist: smithed>=0.19.0
|
|
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
|
|
|
5
5
|
|
|
6
6
|
[project]
|
|
7
7
|
name = "stewbeet"
|
|
8
|
-
version = "2.2.
|
|
8
|
+
version = "2.2.23"
|
|
9
9
|
description = "Beet Framework made to help generating advanced Minecraft datapack contents"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
license = "MIT"
|
|
@@ -17,7 +17,7 @@ classifiers = [
|
|
|
17
17
|
]
|
|
18
18
|
dependencies = [
|
|
19
19
|
"stouputils>=1.4.1",
|
|
20
|
-
"model_resolver>=1.11.
|
|
20
|
+
"model_resolver>=1.11.2",
|
|
21
21
|
"beet>=0.112.0",
|
|
22
22
|
"bolt>=0.49.2",
|
|
23
23
|
"mecha>=0.99.0",
|
|
@@ -66,6 +66,7 @@ NO_SILK_TOUCH_DROP: str = "no_silk_touch_drop" # Key to an item ID that will d
|
|
|
66
66
|
VANILLA_BLOCK_FOR_ORES: JsonDict = {"id":"minecraft:polished_deepslate", "apply_facing": False} # Vanilla block that will be used for an optimization tip for ores, don't ask questions
|
|
67
67
|
OVERRIDE_MODEL: str = "override_model" # Key to a dictionnary that will be used to override the whole model
|
|
68
68
|
PULVERIZING: str = "simplenergy_pulverizing" # Value of a recipe type, used to generate dusts from ores (used by SimplEnergy)
|
|
69
|
+
AWAKENED_FORGE: str = "stardust_awakened_forge" # Value of a recipe type, used to craft items in the Awakened Forge (used by Stardust Fragment)
|
|
69
70
|
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"}
|
|
70
71
|
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
|
|
71
72
|
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"
|
|
@@ -54,7 +54,60 @@ def generate_everything_about_this_material(
|
|
|
54
54
|
material_base = material.split(":")[-1] # Get the base material name (ex: "adamantium" from "adamantium_fragment")
|
|
55
55
|
main_ingredient = ingr_repr(material, Mem.ctx.project_id) # Get the main ingredient for recipes
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
|
|
58
|
+
## Ingredients (ingot, nugget, raw, and other)
|
|
59
|
+
for item in [material_base, f"{material_base}_fragment", f"{material_base}_ingot", f"{material_base}_nugget", f"raw_{material_base}", f"{material_base}_dust", f"{material_base}_stick", f"{material_base}_rod"]:
|
|
60
|
+
if item + ".png" not in textures:
|
|
61
|
+
continue
|
|
62
|
+
if item not in Mem.definitions:
|
|
63
|
+
Mem.definitions[item] = {}
|
|
64
|
+
item_type = item.replace(f"{material_base}_", "").replace(f"_{material_base}", "")
|
|
65
|
+
Mem.definitions[item]["id"] = CUSTOM_ITEM_VANILLA # Custom item
|
|
66
|
+
Mem.definitions[item][CATEGORY] = "material" # Category
|
|
67
|
+
Mem.definitions[item]["custom_data"] = {"smithed":{}} # Smithed convention
|
|
68
|
+
Mem.definitions[item]["custom_data"]["smithed"]["dict"] = {item_type: {material_base: True}}
|
|
69
|
+
|
|
70
|
+
# Recipes
|
|
71
|
+
if not ignore_recipes:
|
|
72
|
+
Mem.definitions[item][RESULT_OF_CRAFTING] = Mem.definitions[item].get(RESULT_OF_CRAFTING, [])
|
|
73
|
+
Mem.definitions[item][USED_FOR_CRAFTING] = Mem.definitions[item].get(USED_FOR_CRAFTING, [])
|
|
74
|
+
if item.endswith("ingot") or item.endswith("fragment") or item == material_base:
|
|
75
|
+
if f"{material_base}_block.png" in textures:
|
|
76
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[ingr_repr(f"{material_base}_block", Mem.ctx.project_id)]})
|
|
77
|
+
if f"{material_base}_nugget.png" in textures:
|
|
78
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","group":material_base,"shape":["XXX","XXX","XXX"],"ingredients":{"X":ingr_repr(f"{material_base}_nugget", Mem.ctx.project_id)}})
|
|
79
|
+
if f"raw_{material_base}.png" in textures:
|
|
80
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
|
|
81
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
|
|
82
|
+
if f"{material_base}_dust.png" in textures:
|
|
83
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
|
|
84
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
|
|
85
|
+
if f"{material_base}_ore.png" in textures:
|
|
86
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
|
|
87
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
|
|
88
|
+
if f"deepslate_{material_base}_ore.png" in textures:
|
|
89
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
|
|
90
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
|
|
91
|
+
if item.endswith("dust"):
|
|
92
|
+
Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
|
|
93
|
+
Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
|
|
94
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":1,"category":"misc","group":material_base,"ingredient":main_ingredient})
|
|
95
|
+
for pulv_ingr in [f"raw_{material_base}",f"{material_base}_ore",f"deepslate_{material_base}_ore"]:
|
|
96
|
+
if f"{pulv_ingr}.png" in textures:
|
|
97
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":2,"category":"misc","group":material_base,"ingredient":ingr_repr(pulv_ingr, Mem.ctx.project_id)})
|
|
98
|
+
if item.endswith("nugget"):
|
|
99
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].insert(0, {"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[main_ingredient]})
|
|
100
|
+
for gear in SLOTS.keys():
|
|
101
|
+
if f"{material_base}_{gear}.png" in textures:
|
|
102
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"equipment","experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_{gear}", Mem.ctx.project_id)})
|
|
103
|
+
if item.endswith("stick"):
|
|
104
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":4,"category":"misc","shape":["X","X"],"ingredients":{"X":main_ingredient}})
|
|
105
|
+
if item.endswith("rod"):
|
|
106
|
+
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","shape":["X","X","X"],"ingredients":{"X":main_ingredient}})
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
## Placeables (ore, deepslate_ore, block, raw_block)
|
|
58
111
|
for block in [f"{material_base}_block", f"{material_base}_ore", f"deepslate_{material_base}_ore", f"raw_{material_base}_block"]:
|
|
59
112
|
if block + ".png" not in textures:
|
|
60
113
|
continue
|
|
@@ -216,57 +269,6 @@ def generate_everything_about_this_material(
|
|
|
216
269
|
Mem.definitions[tool]["attribute_modifiers"] = [am for am in Mem.definitions[tool]["attribute_modifiers"] if am["type"] != "mining_efficiency"]
|
|
217
270
|
pass
|
|
218
271
|
|
|
219
|
-
## Ingredients (ingot, nugget, raw, and other)
|
|
220
|
-
for item in [material_base, f"{material_base}_ingot", f"{material_base}_nugget", f"raw_{material_base}", f"{material_base}_fragment", f"{material_base}_dust", f"{material_base}_stick", f"{material_base}_rod"]:
|
|
221
|
-
if item + ".png" not in textures:
|
|
222
|
-
continue
|
|
223
|
-
if item not in Mem.definitions:
|
|
224
|
-
Mem.definitions[item] = {}
|
|
225
|
-
item_type = item.replace(f"{material_base}_", "").replace(f"_{material_base}", "")
|
|
226
|
-
Mem.definitions[item]["id"] = CUSTOM_ITEM_VANILLA # Custom item
|
|
227
|
-
Mem.definitions[item][CATEGORY] = "material" # Category
|
|
228
|
-
Mem.definitions[item]["custom_data"] = {"smithed":{}} # Smithed convention
|
|
229
|
-
Mem.definitions[item]["custom_data"]["smithed"]["dict"] = {item_type: {material_base: True}}
|
|
230
|
-
|
|
231
|
-
# Recipes
|
|
232
|
-
if not ignore_recipes:
|
|
233
|
-
Mem.definitions[item][RESULT_OF_CRAFTING] = Mem.definitions[item].get(RESULT_OF_CRAFTING, [])
|
|
234
|
-
Mem.definitions[item][USED_FOR_CRAFTING] = Mem.definitions[item].get(USED_FOR_CRAFTING, [])
|
|
235
|
-
if item.endswith("ingot") or item.endswith("fragment") or item == material_base:
|
|
236
|
-
if f"{material_base}_block.png" in textures:
|
|
237
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[ingr_repr(f"{material_base}_block", Mem.ctx.project_id)]})
|
|
238
|
-
if f"{material_base}_nugget.png" in textures:
|
|
239
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","group":material_base,"shape":["XXX","XXX","XXX"],"ingredients":{"X":ingr_repr(f"{material_base}_nugget", Mem.ctx.project_id)}})
|
|
240
|
-
if f"raw_{material_base}.png" in textures:
|
|
241
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
|
|
242
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"raw_{material_base}", Mem.ctx.project_id)})
|
|
243
|
-
if f"{material_base}_dust.png" in textures:
|
|
244
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
|
|
245
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_dust", Mem.ctx.project_id)})
|
|
246
|
-
if f"{material_base}_ore.png" in textures:
|
|
247
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
|
|
248
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"{material_base}_ore", Mem.ctx.project_id)})
|
|
249
|
-
if f"deepslate_{material_base}_ore.png" in textures:
|
|
250
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
|
|
251
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(f"deepslate_{material_base}_ore", Mem.ctx.project_id)})
|
|
252
|
-
if item.endswith("dust"):
|
|
253
|
-
Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"smelting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":200,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
|
|
254
|
-
Mem.definitions[item][USED_FOR_CRAFTING].append({"type":"blasting","result_count":1,"category":"misc","group":material_base,"experience":0.8,"cookingtime":100,"ingredient":ingr_repr(item, Mem.ctx.project_id),"result":main_ingredient})
|
|
255
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":1,"category":"misc","group":material_base,"ingredient":main_ingredient})
|
|
256
|
-
for pulv_ingr in [f"raw_{material_base}",f"{material_base}_ore",f"deepslate_{material_base}_ore"]:
|
|
257
|
-
if f"{pulv_ingr}.png" in textures:
|
|
258
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":PULVERIZING,"result_count":2,"category":"misc","group":material_base,"ingredient":ingr_repr(pulv_ingr, Mem.ctx.project_id)})
|
|
259
|
-
if item.endswith("nugget"):
|
|
260
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].insert(0, {"type":"crafting_shapeless","result_count":9,"category":"misc","group":material_base,"ingredients":[main_ingredient]})
|
|
261
|
-
for gear in SLOTS.keys():
|
|
262
|
-
if f"{material_base}_{gear}.png" in textures:
|
|
263
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"smelting","result_count":1,"category":"equipment","experience":0.8,"cookingtime":200,"ingredient":ingr_repr(f"{material_base}_{gear}", Mem.ctx.project_id)})
|
|
264
|
-
if item.endswith("stick"):
|
|
265
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":4,"category":"misc","shape":["X","X"],"ingredients":{"X":main_ingredient}})
|
|
266
|
-
if item.endswith("rod"):
|
|
267
|
-
Mem.definitions[item][RESULT_OF_CRAFTING].append({"type":"crafting_shaped","result_count":1,"category":"misc","shape":["X","X","X"],"ingredients":{"X":main_ingredient}})
|
|
268
|
-
pass
|
|
269
|
-
|
|
270
272
|
|
|
271
273
|
# Generate everything about these ores
|
|
272
274
|
def generate_everything_about_these_materials(ores: dict[str, EquipmentsConfig|None], ignore_recipes: bool = False) -> None:
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
from typing import Any, cast
|
|
4
4
|
|
|
5
5
|
from beet import LootTable
|
|
6
|
-
from beet.core.utils import JsonDict
|
|
6
|
+
from beet.core.utils import JsonDict, TextComponent
|
|
7
7
|
from stouputils.decorators import simple_cache
|
|
8
8
|
from stouputils.io import super_json_dump
|
|
9
9
|
from stouputils.print import error
|
|
10
10
|
|
|
11
11
|
from .__memory__ import Mem
|
|
12
|
-
from .constants import NOT_COMPONENTS, PULVERIZING
|
|
12
|
+
from .constants import AWAKENED_FORGE, NOT_COMPONENTS, PULVERIZING
|
|
13
13
|
|
|
14
14
|
# Recipes constants
|
|
15
15
|
FURNACES_RECIPES_TYPES: tuple[str, ...] = ("smelting", "blasting", "smoking", "campfire_cooking")
|
|
@@ -22,17 +22,17 @@ UNUSED_RECIPES_TYPES: tuple[str, ...] = (
|
|
|
22
22
|
"crafting_special_repairitem", "crafting_special_shielddecoration", "crafting_special_tippedarrow",
|
|
23
23
|
"crafting_transmute",
|
|
24
24
|
)
|
|
25
|
-
SPECIAL_RECIPES_TYPES: tuple[str, ...] = (PULVERIZING, )
|
|
25
|
+
SPECIAL_RECIPES_TYPES: tuple[str, ...] = (PULVERIZING, AWAKENED_FORGE)
|
|
26
26
|
ALL_RECIPES_TYPES: tuple[str, ...] = (*FURNACES_RECIPES_TYPES, *CRAFTING_RECIPES_TYPES, *OTHER_RECIPES_TYPES, *UNUSED_RECIPES_TYPES, *SPECIAL_RECIPES_TYPES)
|
|
27
27
|
|
|
28
28
|
# Function mainly used for definitions generation
|
|
29
|
-
@simple_cache
|
|
29
|
+
@simple_cache()
|
|
30
30
|
def ingr_repr(id: str, ns: str|None = None, count: int|None = None) -> JsonDict:
|
|
31
31
|
""" Get the identity of the ingredient from its id for custom crafts
|
|
32
32
|
Args:
|
|
33
33
|
id (str): The id of the ingredient, ex: adamantium_fragment
|
|
34
34
|
ns (str|None): The namespace of the ingredient (optional if 'id' argument is a vanilla item), ex: iyc
|
|
35
|
-
count (int|None): The count of the ingredient (optional, used only when this ingredient format is a result item)
|
|
35
|
+
count (int|None): The count of the ingredient (optional, used only when this ingredient format is a result item) (or use a special type of recipe that supports counts)
|
|
36
36
|
Returns:
|
|
37
37
|
str: The identity of the ingredient for custom crafts,
|
|
38
38
|
ex: {"components":{"minecraft:custom_data":{"iyc":{"adamantium_fragment":True}}}}
|
|
@@ -67,13 +67,14 @@ def item_to_id_ingr_repr(ingr: JsonDict) -> JsonDict:
|
|
|
67
67
|
return r
|
|
68
68
|
|
|
69
69
|
# Mainly used for manual
|
|
70
|
-
@simple_cache
|
|
70
|
+
@simple_cache()
|
|
71
71
|
def ingr_to_id(ingredient: JsonDict, add_namespace: bool = True) -> str:
|
|
72
72
|
""" Get the id from an ingredient dict
|
|
73
73
|
Args:
|
|
74
74
|
ingredient (dict): The ingredient dict
|
|
75
75
|
ex: {"components":{"minecraft:custom_data":{iyc:{adamantium_ingot:True}}}}
|
|
76
76
|
ex: {"item": "minecraft:stick"}
|
|
77
|
+
add_namespace (bool): Whether to add the namespace to the id
|
|
77
78
|
Returns:
|
|
78
79
|
str: The id of the ingredient, ex: "minecraft:stick" or "iyc:adamantium_ingot"
|
|
79
80
|
"""
|
|
@@ -104,8 +105,56 @@ def ingr_to_id(ingredient: JsonDict, add_namespace: bool = True) -> str:
|
|
|
104
105
|
return namespace + ":" + id
|
|
105
106
|
return id
|
|
106
107
|
|
|
108
|
+
@simple_cache()
|
|
109
|
+
def text_component_to_str(tc: TextComponent) -> str:
|
|
110
|
+
""" Convert a TextComponent to a string
|
|
111
|
+
Args:
|
|
112
|
+
tc (TextComponent): The TextComponent to convert
|
|
113
|
+
Returns:
|
|
114
|
+
str: The converted string
|
|
115
|
+
"""
|
|
116
|
+
if isinstance(tc, str):
|
|
117
|
+
return tc
|
|
118
|
+
elif isinstance(tc, list):
|
|
119
|
+
result: str = ""
|
|
120
|
+
for part in tc:
|
|
121
|
+
result += text_component_to_str(part)
|
|
122
|
+
return result
|
|
123
|
+
result: str = ""
|
|
124
|
+
if tc.get("text"):
|
|
125
|
+
result += tc["text"]
|
|
126
|
+
if tc.get("extra"):
|
|
127
|
+
for extra in tc["extra"]:
|
|
128
|
+
result += text_component_to_str(extra)
|
|
129
|
+
return result
|
|
130
|
+
|
|
131
|
+
@simple_cache()
|
|
132
|
+
def ingr_to_name(ingredient: JsonDict) -> str:
|
|
133
|
+
""" Get the name from an ingredient dict
|
|
134
|
+
Args:
|
|
135
|
+
ingredient (dict): The ingredient dict
|
|
136
|
+
ex: {"components":{"minecraft:custom_data":{iyc:{adamantium_ingot:True}}}}
|
|
137
|
+
ex: {"item": "minecraft:stick"}
|
|
138
|
+
Returns:
|
|
139
|
+
str: The name of the ingredient, ex: "Stick" or "Adamantium Ingot"
|
|
140
|
+
"""
|
|
141
|
+
# Internal definitions
|
|
142
|
+
id = ingr_to_id(ingredient, add_namespace=False)
|
|
143
|
+
for component in ("item_name", "custom_name"):
|
|
144
|
+
if Mem.definitions.get(id, {}).get(component):
|
|
145
|
+
return text_component_to_str(Mem.definitions[id][component])
|
|
146
|
+
|
|
147
|
+
# External definitions
|
|
148
|
+
external_id = ingr_to_id(ingredient, add_namespace=True)
|
|
149
|
+
for component in ("item_name", "custom_name"):
|
|
150
|
+
if Mem.external_definitions.get(external_id, {}).get(component):
|
|
151
|
+
return text_component_to_str(Mem.external_definitions[external_id][component])
|
|
152
|
+
|
|
153
|
+
# Default: prettify the id
|
|
154
|
+
return id.replace("_", " ").title()
|
|
155
|
+
|
|
107
156
|
# Mainly used for recipes
|
|
108
|
-
@simple_cache
|
|
157
|
+
@simple_cache()
|
|
109
158
|
def get_vanilla_item_id_from_ingredient(ingredient: JsonDict, add_namespace: bool = True) -> str:
|
|
110
159
|
""" Get the id of the vanilla item from an ingredient dict
|
|
111
160
|
Args:
|
|
@@ -185,7 +234,7 @@ def get_item_from_ingredient(ingredient: JsonDict) -> JsonDict:
|
|
|
185
234
|
|
|
186
235
|
|
|
187
236
|
# Make a loot table
|
|
188
|
-
@simple_cache
|
|
237
|
+
@simple_cache()
|
|
189
238
|
def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int | dict) -> str:
|
|
190
239
|
""" Get the loot table for an ingredient dict
|
|
191
240
|
Args:
|
|
@@ -233,7 +282,7 @@ def loot_table_from_ingredient(result_ingredient: JsonDict, result_count: int |
|
|
|
233
282
|
Mem.ctx.data[loot_table] = LootTable(super_json_dump(file, max_level=9))
|
|
234
283
|
return loot_table
|
|
235
284
|
|
|
236
|
-
@simple_cache
|
|
285
|
+
@simple_cache()
|
|
237
286
|
def get_ingredients_from_recipe(recipe: JsonDict) -> list[str]:
|
|
238
287
|
""" Get the ingredients from a recipe dict
|
|
239
288
|
Args:
|
|
Binary file
|
|
@@ -5,6 +5,7 @@ from stouputils.decorators import measure_time
|
|
|
5
5
|
from stouputils.print import progress
|
|
6
6
|
|
|
7
7
|
from ...core.__memory__ import Mem
|
|
8
|
+
from .awakened_forge import AwakenedForgeRecipeHandler
|
|
8
9
|
from .furnace import FurnaceRecipeHandler
|
|
9
10
|
from .pulverizer import PulverizerRecipeHandler
|
|
10
11
|
from .smithed import SmithedRecipeHandler
|
|
@@ -28,6 +29,7 @@ def beet_default(ctx: Context) -> None:
|
|
|
28
29
|
# Do all the things
|
|
29
30
|
VanillaRecipeHandler.routine()
|
|
30
31
|
SmithedRecipeHandler.routine()
|
|
31
|
-
PulverizerRecipeHandler.routine()
|
|
32
32
|
FurnaceRecipeHandler.routine()
|
|
33
|
+
PulverizerRecipeHandler.routine()
|
|
34
|
+
AwakenedForgeRecipeHandler.routine()
|
|
33
35
|
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
|
|
2
|
+
# Imports
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from beet import Predicate
|
|
6
|
+
from beet.core.utils import JsonDict
|
|
7
|
+
from stouputils.decorators import simple_cache
|
|
8
|
+
|
|
9
|
+
from ...core.__memory__ import Mem
|
|
10
|
+
from ...core.constants import AWAKENED_FORGE
|
|
11
|
+
from ...core.ingredients import (
|
|
12
|
+
get_item_from_ingredient,
|
|
13
|
+
ingr_repr,
|
|
14
|
+
ingr_to_id,
|
|
15
|
+
item_to_id_ingr_repr,
|
|
16
|
+
loot_table_from_ingredient,
|
|
17
|
+
)
|
|
18
|
+
from ...core.utils.io import set_json_encoder, write_function, write_load_file, write_versioned_function
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AwakenedForgeRecipeHandler:
|
|
22
|
+
""" Handler for awakened forge recipe generation.
|
|
23
|
+
|
|
24
|
+
This class handles the generation of awakened forge recipes.
|
|
25
|
+
"""
|
|
26
|
+
def __init__(self) -> None:
|
|
27
|
+
""" Initialize the handler. """
|
|
28
|
+
self.STARDUST_AWAKENED_FORGE_PATH: str = f"{Mem.ctx.project_id}:calls/stardust/awakened_forge_recipes"
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def routine(cls) -> None:
|
|
32
|
+
""" Main routine for awakened forge recipe generation. """
|
|
33
|
+
handler = cls()
|
|
34
|
+
handler.generate_recipes()
|
|
35
|
+
|
|
36
|
+
@simple_cache()
|
|
37
|
+
def stardust_awakened_forge_recipe(self, recipe: JsonDict, item: str) -> str:
|
|
38
|
+
""" Generate a awakened forge recipe.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
recipe (JsonDict): The recipe data.
|
|
42
|
+
item (str): The item to generate the recipe for.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
str: The generated recipe command.
|
|
46
|
+
"""
|
|
47
|
+
# Determine the result
|
|
48
|
+
result: JsonDict = item_to_id_ingr_repr(get_item_from_ingredient(recipe["result"])) if recipe.get("result") else ingr_repr(item, Mem.ctx.project_id)
|
|
49
|
+
result_function: str = ingr_to_id(result, add_namespace=True).replace(":", "/")
|
|
50
|
+
|
|
51
|
+
# Get ingredients
|
|
52
|
+
ingredients: list[JsonDict] = recipe["ingredients"]
|
|
53
|
+
first_ingredient: JsonDict = ingredients[0]
|
|
54
|
+
assert first_ingredient.get("count", 1) <= 64, f"First ingredient must have count <= 64, for {item} recipe {recipe}"
|
|
55
|
+
ingredients = ingredients[1:]
|
|
56
|
+
|
|
57
|
+
# Prepare the check line
|
|
58
|
+
line: str = "execute if data entity @s Item" + json.dumps(item_to_id_ingr_repr(first_ingredient))
|
|
59
|
+
for ingredient in ingredients:
|
|
60
|
+
count: int = ingredient.get("count", 1)
|
|
61
|
+
while True:
|
|
62
|
+
ingredient_copy = ingredient.copy()
|
|
63
|
+
ingredient_copy["count"] = count if count < 64 else 64
|
|
64
|
+
line += f" if entity @n[type=item,nbt={{Item:{json.dumps(item_to_id_ingr_repr(ingredient_copy))}}},distance=..1]"
|
|
65
|
+
count -= 64
|
|
66
|
+
if count <= 0:
|
|
67
|
+
break
|
|
68
|
+
line += f" run return run function {Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/timer"
|
|
69
|
+
|
|
70
|
+
# Write the first result function
|
|
71
|
+
particle: str = recipe.get("particle", r"minecraft:dust{color:[0,0,1],scale:2}")
|
|
72
|
+
write_function(f"{Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/timer", f"""
|
|
73
|
+
# Timer
|
|
74
|
+
scoreboard players add @s stardust.forge_timer 4
|
|
75
|
+
scoreboard players remove @s[scores={{stardust.forge_timer=1..}}] stardust.forge_timer 3
|
|
76
|
+
scoreboard players reset @s[scores={{stardust.forge_timer=..0}}] stardust.forge_timer
|
|
77
|
+
execute if score @s stardust.forge_timer matches 1 run playsound stardust:awakened_forge_crafting ambient @a[distance=..25]
|
|
78
|
+
execute if score @s stardust.forge_timer matches 1.. run particle {particle} ~ ~ ~ 5 5 5 0.1 125
|
|
79
|
+
|
|
80
|
+
# When timer reaches 4, craft the item
|
|
81
|
+
execute if score @s stardust.forge_timer matches 4 run function {Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/craft
|
|
82
|
+
""")
|
|
83
|
+
# Write the second result function
|
|
84
|
+
kill_ingredients: str = ""
|
|
85
|
+
for ingredient in ingredients:
|
|
86
|
+
count: int = ingredient.get("count", 1)
|
|
87
|
+
while True:
|
|
88
|
+
ingredient_copy = ingredient.copy()
|
|
89
|
+
ingredient_copy["count"] = count if count < 64 else 64
|
|
90
|
+
kill_ingredients += f"kill @n[type=item,nbt={{Item:{json.dumps(item_to_id_ingr_repr(ingredient_copy))}}},distance=..1]\n"
|
|
91
|
+
count -= 64
|
|
92
|
+
if count <= 0:
|
|
93
|
+
break
|
|
94
|
+
write_function(f"{Mem.ctx.project_id}:calls/stardust/forge_recipes/{result_function}/craft", f"""
|
|
95
|
+
# Visual and audio feedback
|
|
96
|
+
advancement grant @a[distance=..25] only stardust:visible/adventure/use_awakened_forge
|
|
97
|
+
playsound block.anvil.use block @a[distance=..25]
|
|
98
|
+
particle smoke ~ ~ ~ 0.4 0.4 0.4 0.2 1000
|
|
99
|
+
|
|
100
|
+
# Kill ingredients
|
|
101
|
+
kill @s
|
|
102
|
+
{kill_ingredients}
|
|
103
|
+
|
|
104
|
+
# Spawn result item with Motion [0.0,1.0,0.0]
|
|
105
|
+
tag @e[type=item] add stardust.temp
|
|
106
|
+
execute align xyz run loot spawn ~.5 ~.5 ~.5 loot {loot_table_from_ingredient(result, recipe['result_count'])}
|
|
107
|
+
execute as @e[type=item,tag=!stardust.temp] run data merge entity @s {{Motion:[0.0d,1.0d,0.0d],Glowing:true}}
|
|
108
|
+
tag @e[type=item,tag=stardust.temp] remove stardust.temp
|
|
109
|
+
""")
|
|
110
|
+
|
|
111
|
+
# Return check line
|
|
112
|
+
return line
|
|
113
|
+
|
|
114
|
+
def generate_recipes(self) -> None:
|
|
115
|
+
""" Generate all pulverizer recipes. """
|
|
116
|
+
for item, data in Mem.definitions.items():
|
|
117
|
+
crafts: list[JsonDict] = list(data.get("result_of_crafting", []))
|
|
118
|
+
crafts += list(data.get("used_for_crafting", []))
|
|
119
|
+
|
|
120
|
+
for recipe in crafts:
|
|
121
|
+
if recipe["type"] == AWAKENED_FORGE:
|
|
122
|
+
write_function(
|
|
123
|
+
self.STARDUST_AWAKENED_FORGE_PATH,
|
|
124
|
+
self.stardust_awakened_forge_recipe(recipe, item),
|
|
125
|
+
tags=["stardust:calls/awakened_forge_recipes"],
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Second clock function
|
|
129
|
+
if Mem.ctx.project_id == "stardust" and Mem.ctx.data["stardust"].functions.get("calls/stardust/awakened_forge_recipes"):
|
|
130
|
+
write_load_file("# Awakened Forge timer\nscoreboard objectives add stardust.forge_timer dummy")
|
|
131
|
+
write_versioned_function("second", """
|
|
132
|
+
# Awakened Forge recipes
|
|
133
|
+
execute as @e[type=item,predicate=stardust:awakened_forge_input] at @s run function stardust:forge/second
|
|
134
|
+
""")
|
|
135
|
+
Mem.ctx.data["stardust"].predicates["awakened_forge_input"] = set_json_encoder(Predicate({
|
|
136
|
+
"condition": "minecraft:entity_properties",
|
|
137
|
+
"entity": "this",
|
|
138
|
+
"predicate": {
|
|
139
|
+
"nbt": """{Item:{components:{"minecraft:custom_data":{}}}}""",
|
|
140
|
+
"stepping_on": {
|
|
141
|
+
"block": {
|
|
142
|
+
"blocks": "minecraft:glass"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}), max_level=-1)
|
|
147
|
+
|
|
148
|
+
# Second function, check the structure and call the recipes
|
|
149
|
+
write_function("stardust:forge/second", """
|
|
150
|
+
# Check for Awakened Forge structure
|
|
151
|
+
execute unless function stardust:forge/verify_structure run return fail
|
|
152
|
+
|
|
153
|
+
# Call Awakened Forge recipes
|
|
154
|
+
function #stardust:calls/awakened_forge_recipes
|
|
155
|
+
""")
|
|
156
|
+
|
|
157
|
+
# Check structure function
|
|
158
|
+
write_function("stardust:forge/verify_structure", """
|
|
159
|
+
## Verify Awakened Forge multiblock structure
|
|
160
|
+
scoreboard players set #success stardust.data 0
|
|
161
|
+
|
|
162
|
+
# Structure Orientation
|
|
163
|
+
execute if block ~-2 ~-2 ~-2 #minecraft:diamond_ores if block ~-2 ~-1 ~-2 #minecraft:iron_ores if block ~2 ~-2 ~-2 #minecraft:emerald_ores if block ~2 ~-1 ~-2 #minecraft:coal_ores if block ~2 ~-2 ~2 nether_quartz_ore if block ~2 ~-1 ~2 #minecraft:redstone_ores if block ~-2 ~-2 ~2 #minecraft:gold_ores if block ~-2 ~-1 ~2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
|
|
164
|
+
execute if block ~2 ~-2 ~2 #minecraft:diamond_ores if block ~2 ~-1 ~2 #minecraft:iron_ores if block ~-2 ~-2 ~2 #minecraft:emerald_ores if block ~-2 ~-1 ~2 #minecraft:coal_ores if block ~-2 ~-2 ~-2 nether_quartz_ore if block ~-2 ~-1 ~-2 #minecraft:redstone_ores if block ~2 ~-2 ~-2 #minecraft:gold_ores if block ~2 ~-1 ~-2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
|
|
165
|
+
execute if block ~2 ~-2 ~-2 #minecraft:diamond_ores if block ~2 ~-1 ~-2 #minecraft:iron_ores if block ~2 ~-2 ~2 #minecraft:emerald_ores if block ~2 ~-1 ~2 #minecraft:coal_ores if block ~-2 ~-2 ~2 nether_quartz_ore if block ~-2 ~-1 ~2 #minecraft:redstone_ores if block ~-2 ~-2 ~-2 #minecraft:gold_ores if block ~-2 ~-1 ~-2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
|
|
166
|
+
execute if block ~-2 ~-2 ~2 #minecraft:diamond_ores if block ~-2 ~-1 ~2 #minecraft:iron_ores if block ~-2 ~-2 ~-2 #minecraft:emerald_ores if block ~-2 ~-1 ~-2 #minecraft:coal_ores if block ~2 ~-2 ~-2 nether_quartz_ore if block ~2 ~-1 ~-2 #minecraft:redstone_ores if block ~2 ~-2 ~2 #minecraft:gold_ores if block ~2 ~-1 ~2 #minecraft:lapis_ores run scoreboard players set #success stardust.data 1
|
|
167
|
+
|
|
168
|
+
# Continuation of the structure
|
|
169
|
+
execute if score #success stardust.data matches 1 if block ~ ~-1 ~ glass if block ~2 ~ ~2 glass if block ~-2 ~ ~-2 glass if block ~-2 ~ ~2 glass if block ~2 ~ ~-2 glass if block ~ ~-2 ~ diamond_block if block ~1 ~-1 ~1 dragon_egg if block ~-1 ~-1 ~-1 dragon_egg if block ~-1 ~-1 ~1 dragon_egg if block ~1 ~-1 ~-1 dragon_egg if block ~2 ~-2 ~ beacon if block ~ ~-2 ~2 beacon if block ~-2 ~-2 ~ beacon if block ~ ~-2 ~-2 beacon if block ~1 ~-2 ~ red_concrete if block ~-1 ~-2 ~ red_concrete if block ~ ~-2 ~1 red_concrete if block ~ ~-2 ~-1 red_concrete if block ~1 ~-2 ~1 red_concrete if block ~-1 ~-2 ~1 red_concrete if block ~-1 ~-2 ~-1 red_concrete if block ~1 ~-2 ~-1 red_concrete if block ~1 ~-2 ~2 black_concrete if block ~-1 ~-2 ~2 black_concrete if block ~1 ~-2 ~-2 black_concrete if block ~-1 ~-2 ~-2 black_concrete if block ~2 ~-2 ~1 black_concrete if block ~-2 ~-2 ~1 black_concrete if block ~2 ~-2 ~-1 black_concrete if block ~-2 ~-2 ~-1 black_concrete run return 1
|
|
170
|
+
|
|
171
|
+
# Else, fail
|
|
172
|
+
return fail
|
|
173
|
+
""") # noqa: E501
|
|
174
|
+
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from beet.core.utils import JsonDict, TextComponent
|
|
4
4
|
|
|
5
5
|
from ...core.__memory__ import Mem
|
|
6
|
-
from ...core.constants import PULVERIZING
|
|
6
|
+
from ...core.constants import AWAKENED_FORGE, PULVERIZING
|
|
7
7
|
from ...core.ingredients import FURNACES_RECIPES_TYPES, ingr_to_id
|
|
8
8
|
from .book_components import get_item_component
|
|
9
9
|
from .other_utils import convert_shapeless_to_shaped, high_res_font_from_craft
|
|
@@ -34,6 +34,11 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str, in_lore:
|
|
|
34
34
|
page_font = high_res_font_from_craft(craft)
|
|
35
35
|
use_dialog: bool = SharedMemory.use_dialog > 0 and not in_lore # In lore, we don't need to re-align the content
|
|
36
36
|
|
|
37
|
+
# Convert AWAKENED_FORGE to shaped crafting
|
|
38
|
+
if craft_type == AWAKENED_FORGE:
|
|
39
|
+
craft = convert_shapeless_to_shaped(craft)
|
|
40
|
+
craft["type"] = AWAKENED_FORGE
|
|
41
|
+
|
|
37
42
|
# Show up item title and page font
|
|
38
43
|
titled = name.replace("_", " ").title() + "\n"
|
|
39
44
|
content.append({"text": titled, "font": "minecraft:default", "color": "black", "underlined": True})
|
|
@@ -156,6 +161,123 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str, in_lore:
|
|
|
156
161
|
if len(shape) < 2:
|
|
157
162
|
content.append("\n")
|
|
158
163
|
|
|
164
|
+
# If the craft is AWAKENED_FORGE type
|
|
165
|
+
elif craft_type == AWAKENED_FORGE:
|
|
166
|
+
shape: list[str] = craft["shape"]
|
|
167
|
+
is_small_craft: bool = len(shape) <= 3 and all(len(x) <= 3 for x in shape)
|
|
168
|
+
if use_dialog and not is_small_craft:
|
|
169
|
+
content[-1] = content[-1].replace(page_font, page_font + VERY_SMALL_NONE_FONT*2) # type: ignore
|
|
170
|
+
|
|
171
|
+
# Convert each ingredients to its text component
|
|
172
|
+
formatted_ingredients: dict[str, JsonDict] = {}
|
|
173
|
+
for k, v in craft["ingredients"].items():
|
|
174
|
+
formatted_ingredients[k] = get_item_component(v, count=v.get("count", 1))
|
|
175
|
+
|
|
176
|
+
# Adjust craft shape for special cases
|
|
177
|
+
# Special case: if it's 1 line with 3 columns, add empty lines to center it
|
|
178
|
+
if len(shape) == 1 and len(shape[0]) == 3:
|
|
179
|
+
shape = [" ", shape[0], " "]
|
|
180
|
+
|
|
181
|
+
# Special case: if it's 3 lines with 1 column each, center them horizontally
|
|
182
|
+
elif (len(shape) == 3 and
|
|
183
|
+
all(len(shape_line) == 1 for shape_line in shape)):
|
|
184
|
+
shape = [" " + line + " " for line in shape]
|
|
185
|
+
|
|
186
|
+
# Add each ingredient to the craft
|
|
187
|
+
for index, line in enumerate(shape):
|
|
188
|
+
for i in range(2): # We need two lines to make a square, otherwise it will be a rectangle
|
|
189
|
+
content.append(SMALL_NONE_FONT)
|
|
190
|
+
for k in line:
|
|
191
|
+
if k == " ":
|
|
192
|
+
content.append(INVISIBLE_ITEM_WIDTH)
|
|
193
|
+
else:
|
|
194
|
+
if i == 0:
|
|
195
|
+
content.append(formatted_ingredients[k])
|
|
196
|
+
else:
|
|
197
|
+
copy = formatted_ingredients[k].copy()
|
|
198
|
+
copy["text"] = INVISIBLE_ITEM_WIDTH
|
|
199
|
+
content.append(copy)
|
|
200
|
+
if use_dialog and index != 1 and (not is_small_craft or i != 1):
|
|
201
|
+
content.append(INVISIBLE_ITEM_WIDTH * max(0, (3 if is_small_craft else 4) - len(line)))
|
|
202
|
+
if is_small_craft:
|
|
203
|
+
content.append(NONE_FONT * 2)
|
|
204
|
+
else:
|
|
205
|
+
content.append(NONE_FONT + SMALL_NONE_FONT)
|
|
206
|
+
content.append("\n")
|
|
207
|
+
if len(shape) == 1 and len(shape[0]) < 3:
|
|
208
|
+
content.append("\n")
|
|
209
|
+
pass
|
|
210
|
+
|
|
211
|
+
# Add the result to the craft
|
|
212
|
+
if is_small_craft:
|
|
213
|
+
# First layer of the square
|
|
214
|
+
len_line = len(shape[1]) if len(shape) > 1 else 0
|
|
215
|
+
offset = 4 - len_line
|
|
216
|
+
break_line_pos = content.index("\n", content.index("\n") + 1) # Find the second line break
|
|
217
|
+
try:
|
|
218
|
+
break_line_pos = content.index("\n", break_line_pos + 1) # Find the third line break
|
|
219
|
+
except Exception:
|
|
220
|
+
content.append(SMALL_NONE_FONT)
|
|
221
|
+
break_line_pos = len(content)
|
|
222
|
+
content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1) + SMALL_NONE_FONT * 2))
|
|
223
|
+
content.insert(break_line_pos + 1, result_component)
|
|
224
|
+
if use_dialog:
|
|
225
|
+
content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
|
|
226
|
+
break_line_pos += 1
|
|
227
|
+
|
|
228
|
+
# Second layer of the square
|
|
229
|
+
try:
|
|
230
|
+
break_line_pos = content.index("\n", break_line_pos + 3) # Find the fourth line break
|
|
231
|
+
except Exception:
|
|
232
|
+
content.append("\n" + SMALL_NONE_FONT)
|
|
233
|
+
break_line_pos = len(content)
|
|
234
|
+
content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1) + SMALL_NONE_FONT * 2))
|
|
235
|
+
copy = result_component.copy()
|
|
236
|
+
copy["text"] = INVISIBLE_ITEM_WIDTH
|
|
237
|
+
content.insert(break_line_pos + 1, copy)
|
|
238
|
+
if use_dialog:
|
|
239
|
+
content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
|
|
240
|
+
|
|
241
|
+
# Add break lines for the third layer of a 3x3 craft
|
|
242
|
+
if len(shape) < 3 and len(shape[0]) == 3:
|
|
243
|
+
content.append("\n\n")
|
|
244
|
+
if len(shape) < 2:
|
|
245
|
+
content.append("\n")
|
|
246
|
+
else:
|
|
247
|
+
# First layer of the square
|
|
248
|
+
len_line = len(shape[1]) if len(shape) > 1 else 0
|
|
249
|
+
offset = 4 - len_line
|
|
250
|
+
break_line_pos = content.index("\n", content.index("\n") + 1) # Find the second line break
|
|
251
|
+
try:
|
|
252
|
+
break_line_pos = content.index("\n", break_line_pos + 1) # Find the third line break
|
|
253
|
+
except Exception:
|
|
254
|
+
content.append(SMALL_NONE_FONT)
|
|
255
|
+
break_line_pos = len(content)
|
|
256
|
+
content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1)) + MICRO_NONE_FONT)
|
|
257
|
+
content.insert(break_line_pos + 1, result_component)
|
|
258
|
+
if use_dialog:
|
|
259
|
+
content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
|
|
260
|
+
break_line_pos += 1
|
|
261
|
+
|
|
262
|
+
# Second layer of the square
|
|
263
|
+
try:
|
|
264
|
+
break_line_pos = content.index("\n", break_line_pos + 3) # Find the fourth line break
|
|
265
|
+
except Exception:
|
|
266
|
+
content.append("\n" + SMALL_NONE_FONT)
|
|
267
|
+
break_line_pos = len(content)
|
|
268
|
+
content.insert(break_line_pos, (INVISIBLE_ITEM_WIDTH * (offset - 1)) + MICRO_NONE_FONT)
|
|
269
|
+
copy = result_component.copy()
|
|
270
|
+
copy["text"] = INVISIBLE_ITEM_WIDTH
|
|
271
|
+
content.insert(break_line_pos + 1, copy)
|
|
272
|
+
if use_dialog:
|
|
273
|
+
content.insert(break_line_pos + 2, VERY_SMALL_NONE_FONT + MICRO_NONE_FONT)
|
|
274
|
+
|
|
275
|
+
# Add break lines for the third layer of a 3x4 craft
|
|
276
|
+
if len(shape) < 3 and len(shape[0]) == 4:
|
|
277
|
+
content.append("\n\n")
|
|
278
|
+
if len(shape) < 2:
|
|
279
|
+
content.append("\n")
|
|
280
|
+
content.insert(3, "\n")
|
|
159
281
|
|
|
160
282
|
# If the type is furnace type,
|
|
161
283
|
elif craft_type in FURNACES_RECIPES_TYPES:
|