stewbeet 2.2.0__tar.gz → 2.2.2__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.0 → stewbeet-2.2.2}/PKG-INFO +1 -1
- {stewbeet-2.2.0 → stewbeet-2.2.2}/pyproject.toml +1 -1
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/cli.py +1 -1
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/constants.py +2 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/materials.py +9 -9
- stewbeet-2.2.2/stewbeet/plugins/ingame_manual/assets/mining.png +0 -0
- stewbeet-2.2.2/stewbeet/plugins/ingame_manual/assets/wiki_mining_template.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/book_components.py +8 -7
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/craft_content.py +10 -9
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/image_utils.py +18 -10
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/main.py +172 -49
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/other_utils.py +3 -7
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/page_font.py +5 -2
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/shared_import.py +18 -15
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/_README.md +1 -1
- stewbeet-2.2.2/stewbeet/plugins/ingame_manual/templates/mining.png +0 -0
- stewbeet-2.2.2/stewbeet/plugins/ingame_manual/templates/wiki_mining_template.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/.gitignore +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/LICENSE +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/README.md +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/__main__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/all.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/cd_utils.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/github.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/modrinth.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/pmc.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/continuous_delivery/smithed.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/balancing.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/batteries.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/cables.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_d.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_de.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dn.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dne.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dns.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dnw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ds.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_dw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_e.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_n.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ne.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_new.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ns.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_nw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_s.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_se.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_sw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_u.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ud.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ude.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udn.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udne.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udns.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udnw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uds.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_udw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_ue.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_un.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_une.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uns.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unse.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unsw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_unw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_us.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_use.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usew.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_usw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_uw.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_cable_models/variant_w.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/energy_lib_calls.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/gui.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/item_cable_models/cable.bbmodel +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/item_cable_models/cable_base.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/py.typed +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_block.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/base_item.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_block.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_connected.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/extract_item.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_block.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_connected.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/servo_mechanism_models/insert_item.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/contrib/simplenergy/wrench.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/__memory__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/completion.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/equipments.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/records.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/simplenergy.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/smart_ore_generation.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/definitions_helper/text.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/ingredients.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/utils/io.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/core/utils/sounds.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/bookshelf.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/bookshelf_config.json +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Bitwise.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Block.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Color.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Dump.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Environment.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Generation.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Health.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Hitbox.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Id.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Interaction.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Link.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Log.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Math.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Move.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Position.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Random.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Raycast.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Schedule.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Sidebar.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Spline.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf String.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Time.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Tree.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Vector.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf View.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Bookshelf Xp.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Common Signals.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Furnace NBT Recipes.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/ItemIO.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/SmartOreGeneration.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Smithed Crafter.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/datapack/Smithed Custom Block.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/dependencies/resource_pack/Smithed Crafter.zip +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/archive/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/context_analyzer.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/execution_parser.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/function_analyzer.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/headers/object.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/lang_file/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/auto/lang_file/utils.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compatibilities/neo_enchant/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compatibilities/simpledrawer/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/compute_sha1/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/copy_to_destination/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/furnace.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/pulverizer.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/smithed.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/custom_recipes/vanilla.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/custom_blocks/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/loading/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/loot_tables/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/constants.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/extend_datapack.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/match.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/mod.mcdoc +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/quick_sort.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/datapack/sorters/selection_sort.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/basic_datapack_structure/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/check_unused_textures/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/custom_blocks_ticking/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/dependencies/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/finalyze/last_final/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/furnace.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/heavy_workbench.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/invisible_item.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/invisible_item_release.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/minecraft_font.ttf +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/none.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/none_release.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/pulverizing.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/shaped_2x2.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/shaped_3x3.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/simple_case_no_border.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/stonecutting.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_information.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/assets/wiki_result_of_craft.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/book_optimizer.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/iso_renders.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/showcase_image.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/.gitignore +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/furnace.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/heavy_workbench.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/invisible_item.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/invisible_item_release.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/minecraft_font.ttf +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/none.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/none_release.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/pulverizing.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/shaped_2x2.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/shaped_3x3.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/simple_case_no_border.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/stonecutting.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_information.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_ingredient_of_craft_template.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/templates/wiki_result_of_craft.png +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/ingame_manual/text_components.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/initialize/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/initialize/source_lore_font.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/merge_smithed_weld/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/merge_smithed_weld/weld.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/check_power_of_2/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/item_models/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/item_models/object.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/resource_pack/sounds/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/plugins/verify_definitions/__init__.py +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/stewbeet/py.typed +0 -0
- {stewbeet-2.2.0 → stewbeet-2.2.2}/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.2
|
|
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
|
|
@@ -15,7 +15,7 @@ from .utils import get_project_config
|
|
|
15
15
|
|
|
16
16
|
@handle_error(message="Error while running 'stewbeet'")
|
|
17
17
|
def main():
|
|
18
|
-
second_arg: str = sys.argv[1] if len(sys.argv) == 2 else ""
|
|
18
|
+
second_arg: str = sys.argv[1] if len(sys.argv) == 2 else "build"
|
|
19
19
|
|
|
20
20
|
# Try to find and load the beet configuration file
|
|
21
21
|
cfg: ProjectConfig = get_project_config()
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
# ruff: noqa: E501, RUF012
|
|
3
3
|
# Imports
|
|
4
4
|
from beet.core.utils import JsonDict
|
|
5
|
+
from beet.library import base
|
|
5
6
|
|
|
6
7
|
from ..dependencies.bookshelf import BOOKSHELF_MODULES
|
|
7
8
|
|
|
@@ -49,6 +50,7 @@ MORE_DATA_VERSIONS: dict[tuple[int, ...], int] = {
|
|
|
49
50
|
(1, 21, 10): 4556,
|
|
50
51
|
}
|
|
51
52
|
LATEST_MC_VERSION: str = ".".join(str(x) for x in list(MORE_DATA_VERSIONS.keys())[-1])
|
|
53
|
+
base.LATEST_MINECRAFT_VERSION = LATEST_MC_VERSION
|
|
52
54
|
|
|
53
55
|
# Databases
|
|
54
56
|
CATEGORY: str = "category" # Key for the category, used for recipes and the manual, ex: CATEGORY:"material" or CATEGORY:"equipment"
|
|
@@ -133,7 +133,7 @@ def generate_everything_about_this_material(
|
|
|
133
133
|
gear_config = {}
|
|
134
134
|
if gear == "helmet":
|
|
135
135
|
if not ignore_recipes:
|
|
136
|
-
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X"],"ingredients":{"X": main_ingredient}}]
|
|
136
|
+
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
|
|
137
137
|
if equipments_config:
|
|
138
138
|
gear_config = VanillaEquipments.HELMET.value[equipments_config.equivalent_to]
|
|
139
139
|
Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
@@ -141,7 +141,7 @@ def generate_everything_about_this_material(
|
|
|
141
141
|
Mem.definitions[armor]["equippable"] = {"slot":"head", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
|
|
142
142
|
elif gear == "chestplate":
|
|
143
143
|
if not ignore_recipes:
|
|
144
|
-
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","XXX","XXX"],"ingredients":{"X": main_ingredient}}]
|
|
144
|
+
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","XXX","XXX"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
|
|
145
145
|
if equipments_config:
|
|
146
146
|
gear_config = VanillaEquipments.CHESTPLATE.value[equipments_config.equivalent_to]
|
|
147
147
|
Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
@@ -149,7 +149,7 @@ def generate_everything_about_this_material(
|
|
|
149
149
|
Mem.definitions[armor]["equippable"] = {"slot":"chest", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
|
|
150
150
|
elif gear == "leggings":
|
|
151
151
|
if not ignore_recipes:
|
|
152
|
-
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X","X X"],"ingredients":{"X": main_ingredient}}]
|
|
152
|
+
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX","X X","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
|
|
153
153
|
if equipments_config:
|
|
154
154
|
gear_config = VanillaEquipments.LEGGINGS.value[equipments_config.equivalent_to]
|
|
155
155
|
Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
@@ -157,7 +157,7 @@ def generate_everything_about_this_material(
|
|
|
157
157
|
Mem.definitions[armor]["equippable"] = {"slot":"legs", "asset_id":f"{Mem.ctx.project_id}:{material_base}"}
|
|
158
158
|
elif gear == "boots":
|
|
159
159
|
if not ignore_recipes:
|
|
160
|
-
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","X X"],"ingredients":{"X": main_ingredient}}]
|
|
160
|
+
Mem.definitions[armor][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X X","X X"],"ingredients":{"X": main_ingredient},"manual_priority":0}]
|
|
161
161
|
if equipments_config:
|
|
162
162
|
gear_config = VanillaEquipments.BOOTS.value[equipments_config.equivalent_to]
|
|
163
163
|
Mem.definitions[armor]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
@@ -185,31 +185,31 @@ def generate_everything_about_this_material(
|
|
|
185
185
|
gear_config = VanillaEquipments.SWORD.value[equipments_config.equivalent_to]
|
|
186
186
|
Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
187
187
|
if not ignore_recipes:
|
|
188
|
-
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","X","S"],"ingredients": tools_ingr}]
|
|
188
|
+
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","X","S"],"ingredients": tools_ingr,"manual_priority":0}]
|
|
189
189
|
elif gear == "pickaxe":
|
|
190
190
|
if equipments_config:
|
|
191
191
|
gear_config = VanillaEquipments.PICKAXE.value[equipments_config.equivalent_to]
|
|
192
192
|
Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
193
193
|
if not ignore_recipes:
|
|
194
|
-
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX"," S "," S "],"ingredients": tools_ingr}]
|
|
194
|
+
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XXX"," S "," S "],"ingredients": tools_ingr,"manual_priority":0}]
|
|
195
195
|
elif gear == "axe":
|
|
196
196
|
if equipments_config:
|
|
197
197
|
gear_config = VanillaEquipments.AXE.value[equipments_config.equivalent_to]
|
|
198
198
|
Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
199
199
|
if not ignore_recipes:
|
|
200
|
-
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX","XS"," S"],"ingredients": tools_ingr}]
|
|
200
|
+
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX","XS"," S"],"ingredients": tools_ingr,"manual_priority":0}]
|
|
201
201
|
elif gear == "shovel":
|
|
202
202
|
if equipments_config:
|
|
203
203
|
gear_config = VanillaEquipments.SHOVEL.value[equipments_config.equivalent_to]
|
|
204
204
|
Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
205
205
|
if not ignore_recipes:
|
|
206
|
-
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","S","S"],"ingredients": tools_ingr}]
|
|
206
|
+
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["X","S","S"],"ingredients": tools_ingr,"manual_priority":0}]
|
|
207
207
|
elif gear == "hoe":
|
|
208
208
|
if equipments_config:
|
|
209
209
|
gear_config = VanillaEquipments.HOE.value[equipments_config.equivalent_to]
|
|
210
210
|
Mem.definitions[tool]["max_damage"] = int(gear_config["durability"] * durability_factor)
|
|
211
211
|
if not ignore_recipes:
|
|
212
|
-
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX"," S"," S"],"ingredients": tools_ingr}]
|
|
212
|
+
Mem.definitions[tool][RESULT_OF_CRAFTING] = [{"type":"crafting_shaped","result_count":1,"category":"equipment","shape":["XX"," S"," S"],"ingredients": tools_ingr,"manual_priority":0}]
|
|
213
213
|
if equipments_config:
|
|
214
214
|
Mem.definitions[tool]["attribute_modifiers"] = format_attributes(equipments_config.get_tools_attributes(), SLOTS[gear], gear_config)
|
|
215
215
|
if gear == "sword": # Remove the mining_efficiency attribute from swords
|
|
Binary file
|
|
@@ -51,7 +51,7 @@ def high_res_font_from_ingredient(ingredient: str | JsonDict, count: int = 1) ->
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
# Convert ingredient to formatted JSON for book
|
|
54
|
-
def get_item_component(ingredient: str | JsonDict, only_those_components: list[str] | None = None, count: int = 1) -> JsonDict:
|
|
54
|
+
def get_item_component(ingredient: str | JsonDict, only_those_components: list[str] | None = None, count: int = 1, add_change_page: bool = True) -> JsonDict:
|
|
55
55
|
""" Generate item hover text for a craft ingredient
|
|
56
56
|
Args:
|
|
57
57
|
ingredient (dict|str): The ingredient
|
|
@@ -112,12 +112,13 @@ def get_item_component(ingredient: str | JsonDict, only_those_components: list[s
|
|
|
112
112
|
formatted["hover_event"]["components"] = components
|
|
113
113
|
|
|
114
114
|
# If item is from my datapack, get its page number
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
if add_change_page:
|
|
116
|
+
page_number = get_page_number(id)
|
|
117
|
+
if page_number != -1:
|
|
118
|
+
formatted["click_event"] = {
|
|
119
|
+
"action": "change_page",
|
|
120
|
+
"page": page_number
|
|
121
|
+
}
|
|
121
122
|
|
|
122
123
|
# High resolution
|
|
123
124
|
if SharedMemory.high_resolution:
|
|
@@ -4,7 +4,7 @@ from beet.core.utils import JsonDict, TextComponent
|
|
|
4
4
|
|
|
5
5
|
from ...core.__memory__ import Mem
|
|
6
6
|
from ...core.constants import PULVERIZING
|
|
7
|
-
from ...core.ingredients import FURNACES_RECIPES_TYPES
|
|
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
|
|
10
10
|
from .page_font import generate_page_font
|
|
@@ -43,12 +43,13 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
|
|
|
43
43
|
|
|
44
44
|
# Get result component
|
|
45
45
|
result_count = craft.get("result_count", 1)
|
|
46
|
+
add_change_page_to_ingr: bool = False
|
|
46
47
|
if not craft.get("result"):
|
|
47
|
-
result_component = get_item_component(name, count =
|
|
48
|
+
result_component = get_item_component(name, count=result_count, add_change_page=False) # Avoid self-linking page
|
|
49
|
+
add_change_page_to_ingr = True
|
|
48
50
|
else:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
del result_component["click_event"] # Remove click_event for result item (as we already are on the page)
|
|
51
|
+
add_change_page_to_ingr = ingr_to_id(craft["result"], add_namespace=False) == name
|
|
52
|
+
result_component = get_item_component(craft["result"], count=result_count, add_change_page=not add_change_page_to_ingr)
|
|
52
53
|
result_component["text"] = MICRO_NONE_FONT + result_component["text"] # Left adjustment
|
|
53
54
|
|
|
54
55
|
# If the craft is shaped
|
|
@@ -144,7 +145,7 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
|
|
|
144
145
|
elif craft_type in FURNACES_RECIPES_TYPES:
|
|
145
146
|
|
|
146
147
|
# Convert ingredient to its text component
|
|
147
|
-
formatted_ingredient: JsonDict = get_item_component(craft["ingredient"])
|
|
148
|
+
formatted_ingredient: JsonDict = get_item_component(craft["ingredient"], add_change_page=add_change_page_to_ingr)
|
|
148
149
|
|
|
149
150
|
# Add the ingredient to the craft
|
|
150
151
|
for i in range(2):
|
|
@@ -265,11 +266,11 @@ def generate_craft_content(craft: JsonDict, name: str, page_font: str) -> list[T
|
|
|
265
266
|
content.append("\n")
|
|
266
267
|
content.append("\n")
|
|
267
268
|
|
|
268
|
-
# If the type is special Pulverizing or
|
|
269
|
-
elif craft_type in (PULVERIZING, "stonecutting"):
|
|
269
|
+
# If the type is special Pulverizing, Stonecutting, or Mining,
|
|
270
|
+
elif craft_type in (PULVERIZING, "stonecutting", "mining"):
|
|
270
271
|
|
|
271
272
|
# Convert ingredient to its text component
|
|
272
|
-
formatted_ingredient: JsonDict = get_item_component(craft["ingredient"])
|
|
273
|
+
formatted_ingredient: JsonDict = get_item_component(craft["ingredient"], add_change_page=add_change_page_to_ingr)
|
|
273
274
|
content.append("\n\n")
|
|
274
275
|
for i in range(2):
|
|
275
276
|
|
|
@@ -68,28 +68,36 @@ def add_border(image: Image.Image, border_color: tuple[int, int, int, int], bord
|
|
|
68
68
|
return image
|
|
69
69
|
|
|
70
70
|
# Generate an image showing the result count
|
|
71
|
-
def image_count(count: int) -> Image.Image:
|
|
71
|
+
def image_count(count: int | str) -> Image.Image:
|
|
72
72
|
""" Generate an image showing the result count
|
|
73
73
|
Args:
|
|
74
|
-
count (int): The count to show
|
|
74
|
+
count (int | str): The count to show
|
|
75
75
|
Returns:
|
|
76
76
|
Image: The image with the count
|
|
77
77
|
"""
|
|
78
|
+
count = str(count)
|
|
79
|
+
|
|
78
80
|
# Create the image
|
|
79
81
|
img = Image.new("RGBA", (32, 32), (0, 0, 0, 0))
|
|
80
82
|
draw = ImageDraw.Draw(img)
|
|
81
|
-
|
|
83
|
+
|
|
84
|
+
# Reduce font size if count is too long
|
|
85
|
+
font_size: int = 16 if len(count) < 3 else 8
|
|
82
86
|
font = ImageFont.truetype(f"{TEMPLATES_PATH}/minecraft_font.ttf", size = font_size)
|
|
83
87
|
|
|
84
88
|
# Calculate text size and positions of the two texts
|
|
85
|
-
text_width = draw.textlength(
|
|
89
|
+
text_width = draw.textlength(count, font = font)
|
|
86
90
|
text_height = font_size + 4
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
|
|
92
|
+
# Adjust shadow offset for smaller fonts
|
|
93
|
+
shadow_offset: int = 0 if font_size == 16 else 1
|
|
94
|
+
height_offset: int = 0 if font_size == 16 else 3
|
|
95
|
+
pos_1 = (34-text_width-shadow_offset), (32-text_height-shadow_offset+height_offset)
|
|
96
|
+
pos_2 = (32-text_width), (30-text_height+height_offset)
|
|
89
97
|
|
|
90
98
|
# Draw the count
|
|
91
|
-
draw.text(pos_1,
|
|
92
|
-
draw.text(pos_2,
|
|
99
|
+
draw.text(pos_1, count, (50, 50, 50), font = font)
|
|
100
|
+
draw.text(pos_2, count, (255, 255, 255), font = font)
|
|
93
101
|
return img
|
|
94
102
|
|
|
95
103
|
# Generate high res image for item
|
|
@@ -103,7 +111,7 @@ def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -
|
|
|
103
111
|
str: The font to the generated texture
|
|
104
112
|
"""
|
|
105
113
|
font = get_next_font()
|
|
106
|
-
item = f"{item}_{count}" if count > 1 else item
|
|
114
|
+
item = f"{item}_{count}" if isinstance(count, str) or count > 1 else item
|
|
107
115
|
|
|
108
116
|
# Get output path
|
|
109
117
|
path = f"{SharedMemory.cache_path}/font/high_res/{item}.png"
|
|
@@ -121,7 +129,7 @@ def generate_high_res_font(item: str, item_image: Image.Image, count: int = 1) -
|
|
|
121
129
|
resized = resized.convert("RGBA")
|
|
122
130
|
|
|
123
131
|
# Add the item count
|
|
124
|
-
if count > 1:
|
|
132
|
+
if isinstance(count, str) or count > 1:
|
|
125
133
|
img_count = image_count(count)
|
|
126
134
|
img_count = careful_resize(img_count, high_res)
|
|
127
135
|
resized.paste(img_count, (0, 0), img_count)
|
|
@@ -20,12 +20,13 @@ from ...core.constants import (
|
|
|
20
20
|
CUSTOM_BLOCK_VANILLA,
|
|
21
21
|
OFFICIAL_LIBS,
|
|
22
22
|
OVERRIDE_MODEL,
|
|
23
|
+
PULVERIZING,
|
|
23
24
|
RESULT_OF_CRAFTING,
|
|
24
25
|
USED_FOR_CRAFTING,
|
|
25
26
|
WIKI_COMPONENT,
|
|
26
27
|
)
|
|
27
28
|
from ...core.definitions_helper import add_item_name_and_lore_if_missing
|
|
28
|
-
from ...core.ingredients import ingr_repr, ingr_to_id
|
|
29
|
+
from ...core.ingredients import CRAFTING_RECIPES_TYPES, ingr_repr, ingr_to_id
|
|
29
30
|
from ...core.utils.io import super_merge_dict, write_load_file
|
|
30
31
|
from ..initialize.source_lore_font import find_pack_png
|
|
31
32
|
from ..resource_pack.item_models import (
|
|
@@ -55,6 +56,7 @@ from .shared_import import (
|
|
|
55
56
|
HEAVY_WORKBENCH_CATEGORY,
|
|
56
57
|
HOVER_EQUIVALENTS,
|
|
57
58
|
HOVER_FURNACE_FONT,
|
|
59
|
+
HOVER_MINING_FONT,
|
|
58
60
|
HOVER_PULVERIZING_FONT,
|
|
59
61
|
HOVER_SHAPED_2X2_FONT,
|
|
60
62
|
HOVER_SHAPED_3X3_FONT,
|
|
@@ -63,6 +65,7 @@ from .shared_import import (
|
|
|
63
65
|
MANUAL_ASSETS_PATH,
|
|
64
66
|
MEDIUM_NONE_FONT,
|
|
65
67
|
MICRO_NONE_FONT,
|
|
68
|
+
MINING_FONT,
|
|
66
69
|
NONE_FONT,
|
|
67
70
|
PULVERIZING_FONT,
|
|
68
71
|
SHAPED_2X2_FONT,
|
|
@@ -89,7 +92,8 @@ def deepcopy(x: Any) -> Any:
|
|
|
89
92
|
|
|
90
93
|
def manual_main():
|
|
91
94
|
# Copy everything in the manual assets folder to the templates folder
|
|
92
|
-
|
|
95
|
+
with super_open(f"{TEMPLATES_PATH}/.gitignore", "w") as f:
|
|
96
|
+
f.write("*")
|
|
93
97
|
shutil.copytree(MANUAL_ASSETS_PATH + "assets", TEMPLATES_PATH, dirs_exist_ok = True)
|
|
94
98
|
|
|
95
99
|
# Copy the manual_overrides folder to the templates folder
|
|
@@ -162,6 +166,7 @@ def routine():
|
|
|
162
166
|
Mem.ctx.assets[Mem.ctx.project_id].textures["font/furnace"] = Texture(source_path=f"{TEMPLATES_PATH}/furnace.png")
|
|
163
167
|
Mem.ctx.assets[Mem.ctx.project_id].textures["font/stonecutting"] = Texture(source_path=f"{TEMPLATES_PATH}/stonecutting.png")
|
|
164
168
|
Mem.ctx.assets[Mem.ctx.project_id].textures["font/pulverizing"] = Texture(source_path=f"{TEMPLATES_PATH}/pulverizing.png")
|
|
169
|
+
Mem.ctx.assets[Mem.ctx.project_id].textures["font/mining"] = Texture(source_path=f"{TEMPLATES_PATH}/mining.png")
|
|
165
170
|
|
|
166
171
|
# If the manual cache is enabled and we have a cache file, load it
|
|
167
172
|
cache_pages: bool = manual_config.get("cache_pages", False)
|
|
@@ -325,31 +330,92 @@ def routine():
|
|
|
325
330
|
crafts = remove_unknown_crafts(crafts)
|
|
326
331
|
crafts = unique_list(crafts)
|
|
327
332
|
|
|
328
|
-
#
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
333
|
+
# Helper function to add count information to mining recipes
|
|
334
|
+
def add_count_to_mining_recipe(mining_recipe: JsonDict, no_silk_drop_data: JsonDict | str) -> None:
|
|
335
|
+
if isinstance(no_silk_drop_data, dict) and "count" in no_silk_drop_data:
|
|
336
|
+
count_data: JsonDict | int = no_silk_drop_data["count"]
|
|
337
|
+
if isinstance(count_data, dict):
|
|
338
|
+
# Range of items like {"min": 2, "max": 8}
|
|
339
|
+
if "min" in count_data and "max" in count_data:
|
|
340
|
+
mining_recipe["result_count"] = f"{count_data['min']}-{count_data['max']}"
|
|
341
|
+
elif "min" in count_data:
|
|
342
|
+
mining_recipe["result_count"] = str(count_data["min"])
|
|
343
|
+
elif "max" in count_data:
|
|
344
|
+
mining_recipe["result_count"] = str(count_data["max"])
|
|
345
|
+
else:
|
|
346
|
+
# Single count value
|
|
347
|
+
mining_recipe["result_count"] = str(count_data)
|
|
348
|
+
|
|
349
|
+
# If there is NO_SILK_TOUCH_DROP, add a mining recipe for it
|
|
350
|
+
no_silk_touch_drop: bool = bool(raw_data.get("no_silk_touch_drop", False))
|
|
351
|
+
is_drop_of: list[str] = [
|
|
352
|
+
i for i, d in Mem.definitions.items()
|
|
353
|
+
if d.get("no_silk_touch_drop") and (
|
|
354
|
+
(isinstance(d["no_silk_touch_drop"], str) and d["no_silk_touch_drop"] == name) or
|
|
355
|
+
(isinstance(d["no_silk_touch_drop"], dict) and cast(JsonDict, d["no_silk_touch_drop"]).get("id") == name)
|
|
356
|
+
)
|
|
357
|
+
]
|
|
358
|
+
|
|
359
|
+
# Add mining recipes for items that are drops from other ores
|
|
360
|
+
content_added: bool = False
|
|
361
|
+
if is_drop_of:
|
|
362
|
+
for ore_name in is_drop_of:
|
|
363
|
+
mining_recipe: JsonDict = {
|
|
364
|
+
"type": "mining",
|
|
365
|
+
"ingredient": ingr_repr(ore_name, Mem.ctx.project_id), # The ore being mined
|
|
366
|
+
"result": ingr_repr(name, Mem.ctx.project_id), # This item is the result
|
|
367
|
+
}
|
|
368
|
+
add_count_to_mining_recipe(mining_recipe, Mem.definitions[ore_name]["no_silk_touch_drop"])
|
|
369
|
+
crafts.insert(0, mining_recipe)
|
|
370
|
+
|
|
371
|
+
# Generate the craft content
|
|
372
|
+
content += generate_craft_content(crafts[0], name, page_font)
|
|
373
|
+
content_added = True
|
|
374
|
+
|
|
375
|
+
# Add mining recipe if this item has no_silk_touch_drop (it's an ore)
|
|
376
|
+
if no_silk_touch_drop:
|
|
377
|
+
no_silk_drop_data: JsonDict | str = raw_data["no_silk_touch_drop"]
|
|
378
|
+
result_format: str = no_silk_drop_data if isinstance(no_silk_drop_data, str) else no_silk_drop_data["id"]
|
|
379
|
+
mining_recipe: JsonDict = {
|
|
380
|
+
"type": "mining",
|
|
381
|
+
"ingredient": ingr_repr(name, Mem.ctx.project_id), # The ore being mined
|
|
382
|
+
"result": ingr_repr(result_format, Mem.ctx.project_id), # Proper ingredient format
|
|
383
|
+
}
|
|
384
|
+
add_count_to_mining_recipe(mining_recipe, no_silk_drop_data)
|
|
385
|
+
|
|
386
|
+
# Insert at position 0 so it appears first and generate the craft content
|
|
387
|
+
crafts.insert(0, mining_recipe)
|
|
388
|
+
if not content_added:
|
|
389
|
+
content += generate_craft_content(crafts[0], name, page_font)
|
|
390
|
+
content_added = True
|
|
391
|
+
|
|
392
|
+
# Else, if there are blue crafts, generate the content for the first craft
|
|
393
|
+
elif not content_added:
|
|
394
|
+
blue_crafts: list[JsonDict] = [craft for craft in crafts if not craft.get("result")]
|
|
395
|
+
if blue_crafts:
|
|
396
|
+
# Sort crafts by result_count in reverse order
|
|
397
|
+
blue_crafts.sort(key=lambda craft: craft.get("result_count", 0), reverse=True)
|
|
398
|
+
|
|
399
|
+
# Get the first craft and generate the content
|
|
400
|
+
content += generate_craft_content(blue_crafts[0], name, page_font)
|
|
401
|
+
content_added = True
|
|
402
|
+
|
|
403
|
+
# Else, generate the content for the single item in a big box
|
|
404
|
+
else:
|
|
405
|
+
if page_font == "":
|
|
406
|
+
page_font = get_page_font(number)
|
|
407
|
+
generate_page_font(name, page_font, craft = None)
|
|
408
|
+
component = get_item_component(name)
|
|
409
|
+
component["text"] = NONE_FONT
|
|
410
|
+
component["text"] *= 2
|
|
411
|
+
content.append({"text": "", "font": FONT, "color": "white"}) # Make default font for every next component
|
|
412
|
+
content.append({"text": titled, "font": "minecraft:default", "color": "black", "underlined": True})
|
|
413
|
+
content.append(MEDIUM_NONE_FONT * 2 + page_font + "\n")
|
|
414
|
+
for _ in range(4):
|
|
415
|
+
content.append(MEDIUM_NONE_FONT * 2)
|
|
416
|
+
content.append(component)
|
|
417
|
+
content.append("\n")
|
|
418
|
+
content_added = True
|
|
353
419
|
|
|
354
420
|
## Add wiki information if any
|
|
355
421
|
info_buttons: list[JsonDict] = []
|
|
@@ -370,6 +436,7 @@ def routine():
|
|
|
370
436
|
})
|
|
371
437
|
|
|
372
438
|
# For each craft (except smelting dupes),
|
|
439
|
+
previous_result: Any = None
|
|
373
440
|
for i, craft in enumerate(crafts):
|
|
374
441
|
if craft["type"] == "crafting_shapeless":
|
|
375
442
|
craft = convert_shapeless_to_shaped(craft)
|
|
@@ -394,22 +461,34 @@ def routine():
|
|
|
394
461
|
hover_text = [{"text":""}, craft_content]
|
|
395
462
|
|
|
396
463
|
# Add recipe type title
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
464
|
+
if craft["type"] not in CRAFTING_RECIPES_TYPES:
|
|
465
|
+
recipe_type_names: dict[str, str] = {
|
|
466
|
+
"mining": "Mining",
|
|
467
|
+
"crafting_shaped": "Shaped Recipe",
|
|
468
|
+
"crafting_shapeless": "Shapeless Recipe",
|
|
469
|
+
"smelting": "Smelting",
|
|
470
|
+
"blasting": "Blasting",
|
|
471
|
+
"smoking": "Smoking",
|
|
472
|
+
"campfire_cooking": "Campfire Cooking",
|
|
473
|
+
"stonecutting": "Stonecutting",
|
|
474
|
+
"smithing_transform": "Smithing Transform",
|
|
475
|
+
"smithing_trim": "Smithing Trim",
|
|
476
|
+
PULVERIZING: "SimplEnergy Pulverizing"
|
|
477
|
+
}
|
|
478
|
+
recipe_title = recipe_type_names.get(craft["type"], craft["type"].replace("_", " ").title())
|
|
479
|
+
hover_text.insert(0, {"text": f"{recipe_title}\n", "color": "yellow"})
|
|
410
480
|
|
|
411
481
|
# Append ingredients
|
|
412
|
-
if craft
|
|
482
|
+
if craft["type"] == "mining":
|
|
483
|
+
# For mining recipes, show what is being mined and what it drops
|
|
484
|
+
ore_name = ingr_to_id(craft["ingredient"], False).replace("_", " ").title()
|
|
485
|
+
result_name = ingr_to_id(craft["result"], False).replace("_", " ").title()
|
|
486
|
+
hover_text.append({"text": "\n- Mine: ", "color": "gray"})
|
|
487
|
+
hover_text.append({"text": ore_name, "color": "gray"})
|
|
488
|
+
result_count = craft.get("result_count", "1")
|
|
489
|
+
hover_text.append({"text": f"\n- Drops: x{result_count} ", "color": "gray"})
|
|
490
|
+
hover_text.append({"text": result_name, "color": "gray"})
|
|
491
|
+
elif craft.get("ingredient"):
|
|
413
492
|
id = ingr_to_id(craft["ingredient"], False).replace("_", " ").title()
|
|
414
493
|
hover_text.append({"text": "\n- x1 ", "color": "gray"})
|
|
415
494
|
hover_text.append({"text": id, "color": "gray"})
|
|
@@ -453,6 +532,12 @@ def routine():
|
|
|
453
532
|
hover_text.append({"text": "\n- Pattern: ", "color": "gray"})
|
|
454
533
|
hover_text.append({"text": pattern_name, "color": "gray"})
|
|
455
534
|
|
|
535
|
+
# Skip if result is same as previous result
|
|
536
|
+
current_result: Any | None = craft.get("result")
|
|
537
|
+
if current_result and current_result == previous_result and craft["type"] != "mining":
|
|
538
|
+
continue
|
|
539
|
+
previous_result = current_result
|
|
540
|
+
|
|
456
541
|
# Add the craft to the content
|
|
457
542
|
result_or_ingredient = WIKI_RESULT_OF_CRAFT_FONT if "result" not in craft else generate_wiki_font_for_ingr(name, craft)
|
|
458
543
|
info_buttons.append({
|
|
@@ -460,33 +545,69 @@ def routine():
|
|
|
460
545
|
"hover_event": {
|
|
461
546
|
"action": "show_text",
|
|
462
547
|
"value": hover_text
|
|
463
|
-
}
|
|
548
|
+
},
|
|
549
|
+
"priority": craft.get("manual_priority", 1)
|
|
464
550
|
})
|
|
465
551
|
|
|
466
552
|
# If there is a result to the craft, try to add the click_event that change to that page
|
|
467
|
-
if "result" in craft
|
|
468
|
-
|
|
469
|
-
if
|
|
553
|
+
craft_result: str = "" if "result" not in craft else ingr_to_id(craft["result"], False)
|
|
554
|
+
if craft_result and craft_result != name:
|
|
555
|
+
if craft_result in Mem.definitions:
|
|
556
|
+
info_buttons[-1]["click_event"] = {
|
|
557
|
+
"action": "change_page",
|
|
558
|
+
"page": get_page_number(craft_result)
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
# Else, try to add the click_event that change to that page
|
|
562
|
+
else:
|
|
563
|
+
# If there is only one ingredient, link to it
|
|
564
|
+
craft_ingredient: str = ""
|
|
565
|
+
if craft.get("ingredient"):
|
|
566
|
+
craft_ingredient = ingr_to_id(craft["ingredient"], False)
|
|
567
|
+
elif craft.get("ingredients") and isinstance(craft["ingredients"], list) and len(craft["ingredients"]) == 1:
|
|
568
|
+
craft_ingredient = ingr_to_id(craft["ingredients"][0], False)
|
|
569
|
+
elif craft.get("ingredients") and isinstance(craft["ingredients"], dict) and len(craft["ingredients"]) == 1:
|
|
570
|
+
craft_ingredient = ingr_to_id(next(iter(craft["ingredients"].values())), False)
|
|
571
|
+
if craft_ingredient and craft_ingredient in Mem.definitions and craft_ingredient != name:
|
|
470
572
|
info_buttons[-1]["click_event"] = {
|
|
471
573
|
"action": "change_page",
|
|
472
|
-
"page": get_page_number(
|
|
574
|
+
"page": get_page_number(craft_ingredient),
|
|
575
|
+
"blue_craft": craft_result == "" # No result = blue craft
|
|
473
576
|
}
|
|
474
577
|
|
|
475
578
|
# Add wiki buttons 5 by 5
|
|
476
579
|
if info_buttons:
|
|
477
580
|
|
|
478
|
-
#
|
|
479
|
-
if
|
|
581
|
+
# Retrieve buttons limit depending on number of lines in the content (more lines = less buttons)
|
|
582
|
+
buttons_limit: int = 20 if str(content).count("\\n") <= 6 else 15
|
|
583
|
+
|
|
584
|
+
# If too many buttons, remove all the blue ones (blue_craft) except the last one
|
|
585
|
+
if len(info_buttons) > buttons_limit:
|
|
480
586
|
first_index: int = 0 if not raw_data.get(WIKI_COMPONENT) else 1
|
|
481
587
|
last_index: int = -1
|
|
482
588
|
for i, button in enumerate(info_buttons):
|
|
483
|
-
if
|
|
589
|
+
if button.get("click_event", {}).get("blue_craft", False) and i != first_index:
|
|
484
590
|
last_index = i
|
|
485
591
|
|
|
486
592
|
# If there are more than 1 blue button, remove them except the last one
|
|
487
593
|
if (last_index - first_index) > 1:
|
|
488
594
|
info_buttons = info_buttons[:first_index] + info_buttons[last_index:]
|
|
489
595
|
|
|
596
|
+
# If there are more than buttons_limit buttons, remove lowest priority ones until there is buttons_limit left
|
|
597
|
+
while len(info_buttons) > buttons_limit:
|
|
598
|
+
lowest_priority: int = min(info_buttons[::-1], key=lambda x: x.get("priority", 1))
|
|
599
|
+
info_buttons.remove(lowest_priority)
|
|
600
|
+
|
|
601
|
+
# Keep only the last buttons_limit buttons (maximum that can be displayed with 5 per line and 4 lines)
|
|
602
|
+
info_buttons = info_buttons[:buttons_limit]
|
|
603
|
+
|
|
604
|
+
for button in info_buttons:
|
|
605
|
+
click_event: JsonDict = button.get("click_event", {})
|
|
606
|
+
if click_event.get("blue_craft", False):
|
|
607
|
+
del click_event["blue_craft"]
|
|
608
|
+
if button.get("priority"):
|
|
609
|
+
del button["priority"]
|
|
610
|
+
|
|
490
611
|
# Add a breakline only if there aren't too many breaklines already
|
|
491
612
|
content.append("\n")
|
|
492
613
|
|
|
@@ -666,11 +787,13 @@ def routine():
|
|
|
666
787
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/furnace.png", "ascent": 1, "height": 58, "chars": [FURNACE_FONT]})
|
|
667
788
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/stonecutting.png", "ascent": 4, "height": 58, "chars": [STONECUTTING_FONT]})
|
|
668
789
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/pulverizing.png", "ascent": 4, "height": 58, "chars": [PULVERIZING_FONT]})
|
|
790
|
+
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/mining.png", "ascent": 4, "height": 58, "chars": [MINING_FONT]})
|
|
669
791
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/shaped_3x3.png", "ascent": -4, "height": 58, "chars": [HOVER_SHAPED_3X3_FONT]})
|
|
670
792
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/shaped_2x2.png", "ascent": -2, "height": 58, "chars": [HOVER_SHAPED_2X2_FONT]})
|
|
671
793
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/furnace.png", "ascent": -3, "height": 58, "chars": [HOVER_FURNACE_FONT]})
|
|
672
794
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/stonecutting.png", "ascent": -3, "height": 58, "chars": [HOVER_STONECUTTING_FONT]})
|
|
673
795
|
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/pulverizing.png", "ascent": -3, "height": 58, "chars": [HOVER_PULVERIZING_FONT]})
|
|
796
|
+
SharedMemory.font_providers.append({"type":"bitmap","file":f"{Mem.ctx.project_id}:font/mining.png", "ascent": -3, "height": 58, "chars": [HOVER_MINING_FONT]})
|
|
674
797
|
fonts = {"providers": SharedMemory.font_providers}
|
|
675
798
|
with super_open(f"{SharedMemory.cache_path}/font/manual.json", "w") as f:
|
|
676
799
|
f.write(super_json_dump(fonts))
|
|
@@ -14,13 +14,7 @@ from ...core.ingredients import (
|
|
|
14
14
|
ingr_repr,
|
|
15
15
|
ingr_to_id,
|
|
16
16
|
)
|
|
17
|
-
from .shared_import import
|
|
18
|
-
FURNACE_FONT,
|
|
19
|
-
PULVERIZING_FONT,
|
|
20
|
-
SHAPED_2X2_FONT,
|
|
21
|
-
SHAPED_3X3_FONT,
|
|
22
|
-
STONECUTTING_FONT,
|
|
23
|
-
)
|
|
17
|
+
from .shared_import import FURNACE_FONT, MINING_FONT, PULVERIZING_FONT, SHAPED_2X2_FONT, SHAPED_3X3_FONT, STONECUTTING_FONT
|
|
24
18
|
|
|
25
19
|
|
|
26
20
|
# Convert craft function
|
|
@@ -101,6 +95,8 @@ def high_res_font_from_craft(craft: JsonDict) -> str:
|
|
|
101
95
|
return PULVERIZING_FONT
|
|
102
96
|
elif craft["type"] == "stonecutting":
|
|
103
97
|
return STONECUTTING_FONT
|
|
98
|
+
elif craft["type"] == "mining":
|
|
99
|
+
return MINING_FONT
|
|
104
100
|
else:
|
|
105
101
|
return ""
|
|
106
102
|
|
|
@@ -202,9 +202,12 @@ def generate_wiki_font_for_ingr(name: str, craft: JsonDict) -> str:
|
|
|
202
202
|
item_texture = careful_resize(item_texture, item_res_adjusted)
|
|
203
203
|
item_texture = item_texture.convert("RGBA")
|
|
204
204
|
|
|
205
|
-
# Load the template
|
|
206
|
-
|
|
205
|
+
# Load the template
|
|
206
|
+
filename: str = "wiki_ingredient_of_craft_template.png" if craft["type"] != "mining" else "wiki_mining_template.png"
|
|
207
|
+
template = Image.open(f"{TEMPLATES_PATH}/{filename}")
|
|
207
208
|
template = careful_resize(template, item_res)
|
|
209
|
+
|
|
210
|
+
# Paste the texture on it
|
|
208
211
|
offset = (item_res - item_res_adjusted) // 2
|
|
209
212
|
template.paste(item_texture, (offset, offset), item_texture)
|
|
210
213
|
|